@@ -1042,6 +1052,26 @@ LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
```sql
SELECT * FROM tbl WHERE col = col = 'abc'
```
## 建表语句中定义为 ON UPDATE CURRENT\_TIMESTAMP 的字段不建议包含业务逻辑
* **Item**:RES.010
* **Severity**:L2
* **Content**:定义为 ON UPDATE CURRENT\_TIMESTAMP 的字段在该表其他字段更新时会联动修改,如果包含业务逻辑用户可见会埋下隐患。后续如有批量修改数据却又不想修改该字段时会导致数据错误。
* **Case**:
```sql
CREATE TABLE category (category_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(25) NOT NULL, last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (category_id)
```
## 更新请求操作的表包含 ON UPDATE CURRENT\_TIMESTAMP 字段
* **Item**:RES.011
* **Severity**:L2
* **Content**:定义为 ON UPDATE CURRENT\_TIMESTAMP 的字段在该表其他字段更新时会联动修改,请注意检查。如不想修改字段的更新时间可以使用如下方法:UPDATE category SET name='ActioN', last\_update=last\_update WHERE category\_id=1
* **Case**:
```sql
UPDATE category SET name='ActioN', last_update=last_update WHERE category_id=1
```
## 请谨慎使用TRUNCATE操作
* **Item**:SEC.001
...
...
@@ -1182,6 +1212,16 @@ SELECT * FROM staff WHERE name IN (SELECT NAME FROM customer ORDER BY name LIMIT
```sql
SELECT * FROM staff WHERE name IN (SELECT max(NAME) FROM customer)
```
## 外层带有 LIMIT 输出限制的 UNION 联合查询,其内层查询建议也添加 LIMIT 输出限制
* **Item**:SUB.007
* **Severity**:L2
* **Content**:有时 MySQL 无法将限制条件从外层“下推”到内层,这会使得原本可以限制能够限制部分返回结果的条件无法应用到内层查询的优化上。比如:(SELECT \* FROM tb1 ORDER BY name) UNION ALL (SELECT \* FROM tb2 ORDER BY name) LIMIT 20; MySQL 会将两个子查询的结果放在一个临时表中,然后取出 20 条结果,可以通过在两个子查询中添加 LIMIT 20 来减少临时表中的数据。(SELECT \* FROM tb1 ORDER BY name LIMIT 20) UNION ALL (SELECT \* FROM tb2 ORDER BY name LIMIT 20) LIMIT 20;
* **Case**:
```sql
(SELECT * FROM tb1 ORDER BY name LIMIT 20) UNION ALL (SELECT * FROM tb2 ORDER BY name LIMIT 20) LIMIT 20;