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

MySQL 8 特性

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

表操作

创建表

设置主键自增

1
2
3
4
5
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
  • 主键自增只有主键可以设置;

修改表

表改名

1
RENAME TABLE test.login TO test.login_backup

更改表的定义

官方文档

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

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

数据操作

数据处理

类型转换

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

字符串替换、拼接、截取

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

示例代码:

1
2
3
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)

数据插入

插入子查询的结果

忽略部分错误

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

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

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

执行 .sql 代码

如执行 ~/run.sql

1
source ~/run.sql