本篇作为 SQL Server 的补充。SQL Server 有不少很不错的功能。

# MySQL 8 特性

在 MySQL 8 中写表的名字最好把数据库带上,如 test_tb.table1。否则可能会报错。

# 表操作

# 创建表

# 设置主键自增

CREATE TABLE user(
       userid       INT(4)      PRIMARY KEY NOT NULL AUTO_INCREMENT,
       username     VARCHAR(16) NOT NULL,
       userpassword VARCHAR(32) NOT NULL
);
  • 主键自增是为了防止 id 重复,如果存 NULL,他就会设置为目前最大的 id + 1
  • 主键自增只有主键可以设置;

# 修改表

# 表改名

RENAME TABLE test.login TO test.login_backup

# 更改表的定义

官方文档 (opens new window)

用下面这种方式可以修改属性名或属性定义。原表中该属性的分量也会自动转换类型。

ALTER TABLE test.top100_count
CHANGE id id INT PRIMARY KEY;

# 数据操作

# 内置函数

# 类型转换

在需要类型转换的时候(如将 A 表的 SELECT 的 TEXT 数据 INSERT 进 B 表的 INTEGER 属性),MySQL 会自动完成类型转换(如 TEXT 转为 VARCHAR(10)INTEGER)。

但是,如果查询的 WHERE 条件中发生了隐式转换,可能会导致不能正确走索引,如下:

select col1 from table where col_varchar=123;

# 字符串替换、拼接、截取

  • 字符串的替换使用 replace(date, '.', ''),会将 date 中的 . 删去;
  • 字符串的拼接使用 concat(date, time),会将两个字符串进行拼接;
  • date + time 会尝试将两个字符串转为数字以后相加。如果无法转为数字则报错;
  • left(date, 3)right(date, 3) 分别取 date左三个字符右三个字符

示例代码:

INSERT IGNORE INTO test.online_count_2 (date_time, count)
SELECT CONCAT(REPLACE(date, '.', ''), REPLACE(time, ':', '')), count
  FROM test.online_count;

对于 online_count 中记录为 (07.01, 12:30, 12345) 的行,导入 online_count_2 的内容是 (7011230, 123450)

# INSERT

# 插入子查询的结果时忽略部分错误

我们想要将 A 表的数据插入 B 表,但是直接插入的话部分行会是无法插入的(如 A 的部分行插入 B 会使得 B 的主键重复)。这会导致插入操作被终止,所有行都没有被插入 B 表。

如果我们想要在插入的时候忽略掉掉错误行,把其他正确行插入,可以使用 IGNORE 关键字:

INSERT IGNORE INTO A(VALUE1, VALUE2)
SELECT *
  FROM B

# explain 调试法

explain <SQL>
show warnings \G

# 执行 .sql 代码

如执行 ~/run.sql

source ~/run.sql