mysql 使用记录
- 常用方法
- IFNULL
- UUID
- REPLACE
- CONCAT
- insert into select from
- 常见问题
- Error Code: 1054
常用方法
IFNULL
IFNULL(表达式, 默认值),如果表达式为NULL,返回默认值。
UUID
生成36位字符主键,通常和replace函数结合使用,去掉中间的’-'字符。
select @parentId := REPLACE(UUID(), '-', '');
insert into test (id, t_name) values(@parentId,'1');
REPLACE
# 语法
replace(object, search, str)
# 示例
SELECT replace(email, 'com', 'net') FROM user
把object中出现search的全部替换为str
CONCAT
使用最多的场景是在mybatis的xml中的模糊查询,避免使用$产生sql注入问题,例如:
account_bank like concat('%', #{accountBank}, '%')
insert into select from
DROP PROCEDURE IF EXISTS copy_test;
DELIMITER $$
CREATE PROCEDURE copy_test (IN t_id VARCHAR(2) character set utf8)
BEGIN
insert into proce_test (id, name, tenant_id)
select UUID(), name, t_id from proce_test where tenant_id is null;
END$$
DELIMITER ;
常见问题
Error Code: 1054
- 问题描述
Error Code: 1054. Unknown column 'TABLE.ID' in 'field list'
数据库中存在小写的table,字段名也是小写,只因为sql中使用了大写所以报错。
- 问题详解
是因为不同的操作系统对数据库表和字段名大小写支持的的问题导致,可以使用如下语句(其中一种即可)查询lower_case_table_names配置项:
select @@lower_case_table_names;
show variables like 'lower_case_table_names';
lower_case_table_names=0,说明表名存储为给定的大小和比较是区分大小写的
lower_case_table_names=1,说明表名存储在磁盘是小写的,但是比较的时候是不区分大小写
lower_case_table_names=2,说明表名存储为给定的大小写但是比较的时候是小写的
unix,linux下lower_case_table_names默认值为 0 .Windows下默认值是 1 .Mac OS X下默认值是 2
- 解决方式
在my.cnf配置文件中[mysqld]标签的作用区域,增加lower_case_table_names=1
的配置,然后重启MySQL服务