跳到主要内容

数据操作

信息

SQL中的数据操作包括DML语句和DQL语句,主要涉及数据的插入(INSERT)、查询(SELECT)、更新(UPDATE)和删除(DELETE)等操作。这些数据操作语句的不恰当写法可能会导致SQL在正确性、安全性、可维护性、性能方面的各种问题,PawSQL针对数据操作语句从这四个角度共设计了85个审核规则。

dataOps

正确性规则

1. INSERT...VALUES列和值数量一致

规则描述

INSERT...VALUES语句是根据列和值的顺序建立对应关系的,如果二者数量不一致,说明语句不正确。

默认预警级别

  • 禁止

触发条件

  • INSERT...VALUES的列显式的指定
  • INSERT...VALUES列和值数量一致

2. 避免常量字符串开头或结尾包含空格

规则描述

一个字符串开头和结尾的空格通常来讲都没有意义,在SQL中出现的类似常量通常是由于开发人员误输入导致的,但是它可能会影响SQL查询的结果,因此需要特别关注。

默认预警级别

  • 警告

触发条件

  • 常量字符串开头或结尾包含空格
  • 常量字符串出现在判断条件中

3. 避免COUNT DISTINCT多个可空列

规则描述

当你使用COUNT(DISTINCT) 进行多列的计算时,它的计算结果可能和你预想的不同。COUNT(DISTINCT col) 计算该列除 NULL 之外的不重复行数,而COUNT(DISTINCT col, col2)则会排除掉任何一列为NULL的行。

譬如对于如下的查询,对列a和列组合(a,b)的统计不同值的个数,

select count(distinct t.a) a_cnt, count(distinct t.a,t.b) a_b_cnt 
from (values
row(1,2),
row(3,null)) as t(a,b);

其返回对于列a为2,而对于列组合(a,b)则为1,这可能不符合您的预想,需特别关注。

默认预警级别

  • 提示

触发条件

  • SQL中存在COUNT DISTINCT函数
  • COUNT的参数包括二个或两个以上的表达式
  • 参数至少有一个是可以为空的

4. 禁止使用常见 SQL 注入函数

规则描述

SQL注入是一种常见的网络攻击技术,它利用不安全的输入验证和构造SQL查询来获取未授权的信息或是数据库注入恶意代码。常见的SQL注入函数包括database(); user(); version(); sleep()等。

默认预警级别

  • 禁止

触发条件

  • SQL中存在用户配置的函数名称

5. 禁止对非整形常量进行GROUP BY

规则描述

对非整数常量进行分组,其实没有意义;且在PostgreSQL里会语法报错,但是在MySQL里却不会,需特别关注。

SELECT l_orderkey, sum(l_quantity) 
FROM lineitem
GROUP BY '1';

默认预警级别

  • 禁止

触发条件

  • 分组字段为非整型的常量

6. 避免UPDATE/DELETE 中使用 LIMIT 子句

UPDATE语句中使用LIMIT会导致不可预测更新的数据,需谨慎使用。所以PawSQL会检查此类写法,并进行提醒。

默认预警级别

  • 警告

触发条件

  • 语句为UPDATE或DELETE
  • 语句中使用 LIMIT 子句

7. 避免在UPDATE/DELETE中使用LIMIT而没有ORDER BY

规则描述

UPDATEDELETE语句中使用LIMIT而没有ORDER BY,会导致每次执行的结果不一致。PawSQL会检查此类写法,并进行提醒。

PostgreSQL/Opengauss不支持在UPDATEDELETE语句中使用ORDER BY子句。

默认预警级别

  • 警告

触发条件

  • 语句为UPDATE或DELETE
  • 语句中使用 LIMIT 子句而没有使用ORDER子句

8. 避免无条件的UPDATE/DELETE语句

规则描述

没有查询条件或查询条件恒真的UPDATEDELETE语句,会更新或删除所有数据记录,是非常危险的操作。PawSQL会检查此类写法,并进行提醒。

默认预警级别

  • 警告

触发条件

  • 语句为UPDATE或DELETE
  • 语句没有条件

9. 禁止对非整形常量进行ORDER BY

规则描述

对非整数常量进行排序,其实没有意义;且在PostgreSQL里会语法报错,但是在MySQL里却不会,需特别关注。

SELECT l_orderkey 
FROM lineitem
ORDER BY '1';

默认预警级别

  • 警告

触发条件

  • 排序字段为非整型的常量

10. INSERT语句必须包含主键字段

规则描述

对于没有自增主键的表,即使其有默认值,插入数据时应该指定主键的值。

默认预警级别

  • 警告

触发条件

  • 表有主键
  • 主键非自增列

11. 避免在UPDATE/DELETE使用ORDER子句

UPDATE/DELETE语句中使用ORDER无意义。所以PawSQL会检查此类写法,并进行提醒。

默认预警级别

  • 警告

触发条件

  • 语句为UPDATE或DELETE
  • 语句中使用 ORDER子句

12. INSERT语句禁止使用SYSDATE函数

规则描述

当SYSDATE()函数在基于STATEMENT模式的主从环境下可能造成数据的不一致,因为语句在主库中执行到日志传递到备库,存在时间差,到备库执行的时候就会变成不同的时间值。

默认预警级别

  • 警告

触发条件

  • Insert语句中使用SYSDATE函数作为取值
  • MySQL数据库。

13. 避免在SELECT语句中使用LIMIT而没有ORDER子句

规则描述

SELECT语句中使用LIMIT而没有ORDER BY,可能会导致每次执行的结果不一致。PawSQL会检查此类写法,并进行提醒。

默认预警级别

  • 警告

触发条件

  • SELECT语句中使用LIMIT而没有ORDER BY

14. 避免使用没有通配符的 LIKE 查询

规则描述

不包含通配符的LIKE 查询逻辑上与等值查询相同,建议使用等值查询替代。而且不包含通配符的LIKE 查询逻辑通常是由于开发者错误导致的,可能不符合其期望的业务逻辑实现。需要开发这特别关注。

默认预警级别

  • 警告

触发条件

  • SQL中存在LIKE查询条件
  • LIKE的右操作数中不存在'%'或'_'通配符

可维护性规则

1. 在一个查询块中,多表应该使用别名

规则描述

如果在一个查询块存在多个表的引用,建议为每个表起一个简单易认的别名,并为所有的字段添加别名前缀,方便阅读代码以及后续维护。

默认预警级别

  • 提示

触发条件

  • 一个查询块中存在多个表引用

2. INSERT...VALUES应该指定列名

规则描述

INSERT...VALUES语句应该指定列名,它可以减少插入的值与目标表的列之间出现错位的可能性。

insert into customer value(1, 'Dan', 'Mike');

下面的写法可以减少插入的值与目标表的列之间出现错位的可能性,代码更容易维护。

insert into customer(c_custkey, lastname, firstName) value(1, 'Dan', 'Mike');

默认预警级别

  • 提示

触发条件

  • INSERT...VALUES语句列名没有指定

3. 避免表引用使用重复的别名

规则描述

查询语句中存在别名相同的表引用/子查询,或者是表的别名和其他表名本身相同,会导致代码可读性极具恶化,且不利于后续维护。

默认预警级别

  • 警告

触发条件

  • 存在别名相同的表引用/子查询
  • 或表的别名和其他表名本身相同

4. 避免GROUP BY选择列的序号

规则描述

在进行SQL开发时,可以通过GROUP BY选择列的序号来代替选择列本身;这给开发人员带来了一定的便利性,但是也影响了代码的可读性和易维护性。

默认预警级别

  • 提示

触发条件

  • 使用选择列的序号进行GROUP BY

5. 避免使用NATURAL JOIN

规则描述

NATURAL JOIN是一种特殊的等值连接,它可以和内连接、外连接及全连接配合使用,它会自动搜索两张表中所有相同列名和类型的列,并且以这些列为条件进行等值连接。NATURAL JOIN可以简化语句,但隐式连接条件降低代码的可读性,不利于理解表之间的关系,而且容易出现误连接。PawSQL对使用NATURAL JOIN的语句进行了风险提示,以避免其引发的正确性问题。

默认预警级别

  • 警告

预警触发条件

  • SQL语句中出现NATURAL JOIN语法

6. 避免ORDER BY选择列的序号

规则描述

在进行SQL开发时,可以通过ORDER BY选择列的序号来代替选择列本身;这给开发人员带来了一定的便利性,但是也影响了代码的可读性和易维护性。

默认预警级别

  • 提示

触发条件

  • 使用选择列的序号进行ORDER BY

7. 对象前需添加属主

规则描述

在进行SQL开发时,为每一个引用的对象添加其所属的表或子查询标识,可以提升SQL语句的可读性以及后期的可维护性。

默认预警级别

  • 提示

触发条件

  • 存在没有属主标识的字段或表达式引用

8. 避免使用STRAIGHT JOIN

规则描述

STRAIGHT JOIN是MySQL中的一种表连接方式,它会强制以表的定义顺序来进行表连接,在结果上它等价与内连接。它给予了开发人员对数据库执行SQL的一定的控制能力。但它也失去了优化器带来的进行表连接顺序的优化,需要根据场景谨慎使用。PawSQL对使用STRAIGHT_JOIN的语句进行了风险提示,以避免其引起的性能问题。

默认预警级别

  • 警告

触发条件

  • SQL语句中出现STRAIGHT_JOIN语法

9. 建议使用<>代替!=

规则描述

!= 是非标准的运算符,<> 才是SQL中标准的不等于运算符。为了提升SQL的可移植性和规范程度,建议使用<>代替!=

默认预警级别

  • 警告

预警触发条件

  • SQL语句中出现'!=' 运算符

10. 对于入参建议使用变量绑定

规则描述

通过变量绑定,可以重用SQL的执行计划,降低SQL解析的时间;同时还可以避免SQL注入,提升应用的安全性。

默认预警级别

  • 警告

预警触发条件

  • 当用户设定'strict'模式时,在条件及排序的字段中出现任意常量
  • 当用户设定'loose'模式时,在条件及排序的字段中不存在变量绑定

11. SQL长度超过阈值

规则描述

过长的SQL可读性较差,难以维护,且容易引发性能问题;如果SQL的长度超过用户指定的阈值,则触发该规则。具体规则阈值可以根据业务需求调整,默认值:1024。

默认预警级别

  • 提升

预警触发条件

  • SQL文本长度超过阈值

性能规则

1. GROUP字段中有表达式导致索引失效

规则描述

数据库可以利用索引的有序性来避免GROUP子句中列的排序,从而提升SQL的性能。但是如果Group字段是一个表达式或函数,则可能无法利用索引来进行排序。

默认预警级别

  • 提示

触发条件

  • 存在分组字段,字段为表达式或函数

2. ORDER字段中有表达式导致索引失效

规则描述

数据库可以利用索引的有序性来避免ORDER子句中列的排序,从而提升SQL的性能。但是如果ORDER字段是一个表达式或函数,则可能无法利用索引来进行排序。

默认预警级别

  • 提示

触发条件

  • 存在排序字段,字段为表达式或函数

3. 避免使用CROSS JOIN

规则描述

CROSS JOIN会将第一张表的每一行与第二张表的每一行进行笛卡尔乘积。它会生成表1行数x表2行数的记录。理论上它等价与条件为1=1的内连接。CROSS JOIN可以快速将多表拼接,但是其会产生大量记录,造成效率低下;而且不指定连接条件,结果可能没有实际意义。

PawSQL对使用STRAIGHT_JOIN的语句进行了风险提示,以避免其引发的性能问题。

案例SQL如下

SELECT *
FROM lineitem
CROSS JOIN orders;

这会把lineitem表的每条记录都与orders表的所有记录进行组合。

默认预警级别

  • 警告

触发条件

  • SQL语句中出现CROSS JOIN语法

4. 隐式类型转换导致索引失效

规则描述

当条件表达式的数据类型不同时,在查询执行过程中会进行一些隐式的数据类型转换。类型转换有时会应用于条件中的常量,有时会应用于条件中的列。当在列上应用类型转换时,在查询执行期间无法使用索引,可能导致严重的性能问题。譬如对于以下的SQL,

select count(*) from ORDERS where O_ORDERDATE = current_date();

如果O_ORDERDATE列的数据类型是CHAR(16),那么O_ORDERDATE上的索引将不会被使用,导致全表扫描。解决方案通常有两个,一是ALTER TABLE改变O_ORDERDATE的数据类型,二是把current_date强制换换为CHAR类型(PawSQL提供该重写建议)。

 select count(*) ORDERS where ORDERS.O_ORDERDATE = cast(current_date() as CHAR(16));

默认预警级别

  • 警告

触发条件

  • 条件表达式是个过滤条件,且是个可索引的过滤条件
  • 过滤条件两边的数据类型不一样
  • 根据数据库类型转换的优先级,数据库会优先转换列而非常量

5. 连接字段类型不匹配导致索引失效

规则描述

当条件表达式的数据类型不同时,在查询执行过程中会进行一些隐式的数据类型转换。当在列上应用类型转换时,在查询执行期间无法使用索引,可能导致严重的性能问题。PawSQL会检查类型不匹配的连接条件,并进行提醒。

默认预警级别

  • 警告

触发条件

  • 条件表达式是个关联条件,且是个可索引的关联条件
  • 过滤条件两边的数据类型不一样

6. 排序字段方向不同导致索引失效

规则描述

ORDER BY 子句中的所有表达式需要按统一的 ASC 或 DESC 方向排序,才能利用索引来避免排序;如果ORDER BY 语句对多个不同条件使用不同方向的排序无法使用索引。

默认预警级别

  • 提示

触发条件

  • 有多个排序字段
  • 存在两种排序方向

7. 避免GROUPBY字段来自不同表

规则描述

如果分组字段来自不同的表,数据库优化器将没有办法利用索引的有序性来避免一次排序。如果WHERE或是HAVING子句里存在等值条件,PawSQL可以排序或分组字段进行替换,使其来自同一张表,从而能够利用索引来避免一次排序。譬如下面的查询

select o_custkey, c_name, sum(o.O_TOTALPRICE) from customer c, orders o where o_custkey = c_custkey group by o_custkey, c_name

分组字段o_custkey, c_name来自两个表,且存在过滤条件o_custkey = c_custkey,可以重写为

select c_custkey, c_name, sum(o.O_TOTALPRICE) from customer c, orders o where o_custkey = c_custkey  group by c_custkey, c_name

默认预警级别

  • 提示

触发条件

  1. GROUPBY字段来自不同表

  2. 过滤条件是个可索引条件

  3. 在索引列上不存在计算或函数

8. 避免对长字段进行分组

规则描述

在数据库中,分组通常是通过排序或哈希来做,如果需要分组的行数比较多,那么单个字段长度会较大的影响分组效率。此规则可以通过比较分组字段的长度是否超过用户输入的阈值。如果超过阈值,则会进行预警。

默认预警级别

  • 预警

触发条件

  1. GROUP字段类型为CHAR/VARCHAR,且字段长度超过阈值
  2. 或GROUP字段类型为CLOB/TEXT/TINYTEXT/MEDIUMTEXT/LONGTEXT

9. OFFSET的值超过阈值

规则描述

在SQL查询中,LIMIT子句用于限制查询结果的数量,而OFFSET子句用于指定从查询结果集中的哪一行开始返回数据。当OFFSET值很大时,查询引擎必须扫描越来越多的数据,以找到偏移量之后的数据行。在数据集很大的情况下,可能会导致查询变得非常慢,并且可能会占用大量的系统资源。

默认预警级别

  • 提示

触发条件

  • OFFSET的值超过阈值

10. 避免对条件字段使用负向查询

规则描述

负向查询指的是否定查询,即<>NOT IN 等否定条件。此类查询无法利用索引进行快速定位。

默认预警级别

  • 警告

触发条件

  • SQL中的条件为否定条件。

11. 避免无条件且无分组的SELECT语句

规则描述

没有查询条件或查询条件恒真的查询语句,且无分组语法,会导致全表扫描以及结果集巨大。PawSQL会检查此类写法,并进行提醒。

默认预警级别

  • 提示

触发条件

  • SELECT语句无条件且无分组

12. 表连接缺少链接条件

规则描述

表连接缺少链接条件会导致结果集变成两个表的笛卡尔集,数据量巨大,且有较大可能性不符合开发者的预期。PawSQL会检查此类写法,并进行提醒。

默认预警级别

  • 提示

触发条件

  • 表连接缺少链接条件

13. 分区表没有使用分区字段过滤

规则描述

在访问分区表时,没有使用分区字段进行过滤,会导致需要访问所有分区。

默认预警级别

  • 提示

触发条件

  • 表是分区表
  • SQL中不存在在分区键的过滤条件

14. 过滤条件中须使用主键或索引列

规则描述

如果一个表的过滤条件上没有主键或索引,则会导致全表扫描。

默认预警级别

  • 提示

触发条件

  • SQL中存在过滤或关联条件
  • 过滤或关联条件是可索引条件
  • 可索引条件不存在任何可利用的索引(包括主键索引)

15. SELECT 语句必须带LIMIT

规则描述

SELECT语句返回用户所需的记录行,服务端对于查询记录的处理能力通常有一定的限制。通过对SELECT语句添加一个LIMIT语句可以限制异常输入参数导致的返回结果集过大,避免服务端完全宕机。建议生产上的所有SQL启用此规则。

默认预警级别

  • 提示

触发条件

  • SQL是一个SELECT查询语句
  • 此SELECT查询语句没有LIMIT子句

16. INSERT语句中值的数量超过阈值

规则描述

批量插入值可以有效的提升数据插入的效率,如下例,

insert into customer(c_custkey, lastname, firstName)
values(1, 'Dan', 'Mike'),(2, 'Chaw', 'Tomas'),(3, 'Wang', 'Nancy');

但是如果插入的数据量太多,可能会让数据库优化器选择低效的执行计划,导致性能问题。甚至可能超过数据库的限制(MySQL: max_allowed_packet),导致数据库端报错。在PawSQL中,会检查此类写法,并对超过阈值(默认为500)的SQL提示预警。

默认预警级别

  • 提示

触发条件

  • SQL是一个SELECT...VALUES...语句
  • VALUES中的值的个数超过用户指定的阈值(默认为500)

17. 查询中表连接的个数超过阈值

规则描述

在单机版数据库执行计划的规划中,表连接的顺序和连接的方法是数据库优化器最重要的规划内容。表连接数目的增加将几何级数地增加数据库优化器对于最优执行计划的搜寻空间,导致生成执行计划的时间比较长,且容易生成性能较差的执行计划。所以PawSQL检测查询中表连接得数目是否超过某个阈值,并提醒用户可能的风险。在PawSQL中,阈值的默认值是5,用户可以在创建优化任务时修改此阈值。

默认预警级别

  • 警告

触发条件

  • 单个查询块中表连接的个数超过阈值(默认为5)

18. 子查询的嵌套层次超过阈值

规则描述

子查询的嵌套会让SQL变得复杂,而太复杂的SQL会让数据库的优化器生成执行计划的时间比较长,且容易生成性能较差的执行计划,所以PawSQL检测子查询嵌套的层次是否超过某个阈值,并提醒用户可能的风险。在PawSQL中,阈值的默认值是2,用户可以在创建优化任务时修改此阈值。

默认预警级别

  • 警告

触发条件

  • 子查询嵌套的层次超过阈值(默认为2)

19. 避免不同字段的OR条件

规则描述

同字段的OR条件数据库优化器会将其一起考虑,作为一个索引范围扫描的候选项。如果OR条件来自不同字段,数据库优化器可能无法利用索引进行快速数据定位。

默认预警级别

  • 警告

触发条件

  • SQL中存在OR连接的条件
  • OR连接的条件中的列属于不同的列

20. 避免使用随机函数排序

规则描述

MySQL的函数rand或PostgreSQL的函数random会返回一个在范围0到1.0之间的随机浮点数。我们有时候会使用以下查询语句获取数据集的随机样本。

select * from orders order by rand() limit 1; 

如果customer表少于10,000行,则此方法效果很好。但是当您有1,000,000行时,排序的开销变得不可接受。原因很明显:我们将所有行排序,但只保留其中的一行。其实有更高效的方法来实现此需求,点击获取该优化的更详细信息

默认预警级别

  • 警告

触发条件

  • 使用随机函数进行排序

21. 避免查询排序时指定COLLATION

规则描述

可以在SQL中指定排序字段所使用的COLLATION,譬如下面的SQL

select * from customer c order by c_name COLLATE utf8mb4_0900_bin

这样的化,该SQL将无法利用索引的有序性来避免排序。

默认预警级别

  • 警告

触发条件

  • 显式的指定排序的COLLATION

22. 避免ORDERBY字段来自不同表

规则描述

如果排字段来自序不同的表,数据库优化器将没有办法利用索引的有序性来避免一次排序。如果WHERE或是HAVING子句里存在等值条件,PawSQL可以排序或分组字段进行替换,使其来自同一张表,从而能够利用索引来避免一次排序。譬如下面的查询

select * from customer c, orders o where o_custkey = c_custkey order by o_custkey, c_name

排序字段o_custkey, c_name来自两个表,且存在过滤条件o_custkey = c_custkey,可以重写为

select * from customer c, orders o where o_custkey = c_custkey  order by c_custkey, c_name

默认预警级别

  • 提示

触发条件

  1. ORDER字段来自不同表

  2. 过滤条件是个可索引条件

  3. 在索引列上不存在计算或函数

23 .避免对长字段进行排序

规则描述

在计算机中,排序是一个OlnN时间复杂度的操作,如果需要排序的行数比较多,那么单个字段长度会较大的影响排序效率。此规则可以通过比较排序字段的长度是否超过用户输入的阈值。如果超过阈值,则会进行预警。

默认预警级别

  • 预警

触发条件

  1. ORDER字段类型为CHAR/VARCHAR,且字段长度超过阈值
  2. 或ORDER字段类型为CLOB/TEXT/TINYTEXT/MEDIUMTEXT/LONGTEXT

24. 避免%开头的LIKE查询

规则描述

在SQL查询中,LIKE操作符用于匹配字符串。如果模式字符串以%开头(例如LIKE '%ABC'),则数据库优化器无法利用索引来过滤数据,容易造成全表扫描。在没有其他过滤条件的情况下,可能会对查询性能和效率产生较大的影响。所以应该尽量避免%开头的查询条件,如果不得不使用%开头的匹配,可以考虑创建全文索引来提升查询性能。

默认预警级别

  • 警告

触发条件

  • LIKE条件以'%'或'_'开头

25. 避免使用标量子查询

规则描述

标量子查询返回单行单列的一个值,它可以出现在SQL中任何单值出现的地方。标量子查询通常需要在执行时才能确定其是否只返回单行值,且其通常为相关子查询。容易引起运行时错误,以及性能问题。

默认预警级别

  • 提示

触发条件

  • SQL中出现标量子查询

26. 避免在SELECT语句添加FOR UPDATE

规则描述

SELECT语句添加FOR UPDATE会导致锁表或锁数据行,影响查询的并发性,导致阻塞和整体性能下降,需谨慎使用。所以PawSQL会检查此类写法,并进行提醒。

默认预警级别

  • 警告

触发条件

  • 查询语句中出现FOR UPDATE关键字

27. 避免在查询中使用SELECT *

规则描述

在查询中使用SELECT *的缺点如下:

  • SELECT * 中如果包含无用的大字段,尤其是 text /CLOB类型的字段,容易造成无谓磁盘IO和网络开销,
  • 使用SELECT *容易增加代码维护的成本,譬如增减字段容易与 resultMap 配置不一致、insert into select *时字段映射出错
  • 数据库优化器无法进行覆盖索引的规划
  • PawSQL索引推荐无法推荐覆盖索引

获取该优化的更详细信息

默认预警级别

  • 提示

触发条件

  • SQL中出现SELECT *
  • SELECT * 不在EXITS子查询中

28. 使用UNION ALL代替UNION

规则描述

使用UNION来得到两个结果集的并集时,会对并集的结果集进行去重,去重操作在数据库内部是通过排序或是哈希的方式实现,这两种方式都会需要大量的计算资源。如果逻辑上可以保证两个结果集没有重复数据,可以使用UNION ALL来代替UNION,可以获得较大的性能提升。

默认预警级别

  • 提示

触发条件

  • SQL中出现UNION结构

29. 避免更新主键的值

规则描述

在MySQL InnoDB引擎或是SQL Server数据库中,数据存储方式都是以主键的方式组织的。在这种情况下,对主键的更新会涉及到对数据在磁盘上物理组织的调整,而且也涉及到主键值唯一性的检查,在表数据量非常大的情况下,更新的代价可能非常之大。

默认预警级别

  • 警告

触发条件

  • 更新主键的值
  • MySQL InnoDB引擎或是SQL Server数据库

30. 避免更新唯一约束的值

规则描述

对唯一性约束的列的值的更新,需要对它进行唯一性检查,在表数据量非常大的情况下,更新的代价可能非常大。

默认预警级别

  • 警告

触发条件

  • 更新唯一性列的值

31. DELETE/UPDATE禁止使用表连接

规则描述

表连接的误操作可能导致结果集的行非常大,对大结果集的DELETE/UPDATE可能会非常耗时,锁表时间较长,也难以对操作进行回滚。

默认预警级别

  • 警告

触发条件

  • DELETE/UPDATE存在多表

32. 避免使用不必要的内置函数

规则描述

某些内置函数可能不满足业务或是计算上的某些规范要求。通过配置该规则可以指定业务中需要禁止使用的内置函数。

默认预警级别

  • 提示

触发规则

  • 函数列表中的函数名称出现在SQL中。