跳到主要内容

SQL 开发规范一览表

NineData 提供 SQL 开发规范,方便在企业多人协作开发的场景下提供安全管控,确保企业数据库的安全。本文提供当前支持的 SQL 开发规范一览表,以及规范支持的数据源类型。

当前控制台的 SQL 代码审核规则列表中包含以下与字段和核心业务表变更相关的规则:

  • 字段变更包含 FIRST/AFTER/BEFORE 位置语法检查:检查字段变更语句是否使用 FIRST、AFTER、BEFORE 调整字段位置。
  • 核心业务表变更管控:对核心业务表变更进行管控。
  • SQL Server 索引检查:在 SQL 任务中,非新增索引操作不会检查存量索引数量;新增索引操作是否拦截以及相应阈值,以目标规范详情页和当前控制台配置为准。
  • SQL Server 表级主键审核:安全规范审核可以识别 SQL Server 的表级主键定义;具体主键规则、级别和处理方式以目标规范详情页及当前控制台为准。

规则的级别、启用状态、支持数据库和可配置范围以目标规范详情页及当前控制台显示为准。

分类规则名称MySQLSQL
Server
Postgre
SQL
OracleOB
Oracle
DB2Mongo
DB
RedisDorisSelect
DB
达梦DWSTiDBGreat
SQL
ADB
Postgre
SQL
GBaseTDSQL
MySQL
Oceanbase
MySQL
GoldenDBMariaDBVastbaseGaussDBopenGaussElastiCachePegaDBkingbasekingbaseoracle
列限制自增列名字为 ID✔️✔️❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
限制自增列为无符号✔️❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
限制 CHAR 类型字段长度✔️✔️✔️✔️✔️❌❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制字段名大小写✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
字段名不能是关键字✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制列要有注释✔️❌✔️❌❌❌❌❌✔️✔️❌✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制列要有默认值✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制列不可空(NOT NULL)✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制列不能使用部分数据类型✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
不能设置列的字符集✔️❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
不能设置列的校对集✔️✔️❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
限制 VARCHAR 类型字段长度✔️✔️✔️✔️✔️❌❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
分区键为CHAR、VARCHAR类型时长度限制❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️❌❌❌❌❌❌❌❌❌❌
分区键的字段类型❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌❌❌❌❌❌❌❌
不建议索引字段是VARCHAR类型时其长度大于阈值❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️❌❌❌❌❌❌❌❌❌❌
字段危险操作管控✔️❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
表(DDL)限制表字段的数量✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
修改表字符集建议用 ALTER TABLE CONVERT 语法✔️❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
限制表字符集✔️❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
限制表校验规则✔️❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
限制表名大小写✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
表名不能是关键字✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制表必须注释✔️❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
表要有主键✔️✔️✔️✔️✔️✔️❌❌❌❌✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制表不能使用外键✔️✔️✔️✔️✔️✔️❌❌❌❌✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
OnlineDDL:大表结构变更风险检测✔️❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌❌❌❌❌❌
表需要包含某些列✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制表存储引擎✔️❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
限制建表自增初始值✔️✔️❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
同一张表的多条 ALTER 语句建议合为一条✔️❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
数据库限制库的字符集✔️❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
更新UPDATE/DELETE 语句建议指定 WHERE 条件✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
UPDATE/DELETE 语句不能有 ORDER BY 子句✔️❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
UPDATE 多表时检测 SET 的列是否指定表前缀✔️✔️✔️✔️✔️❌❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
UPDATE 语句不建议更新表上的“创建时间”列✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
UPDATE 语句检测是否更新了主键✔️✔️✔️✔️✔️✔️❌❌❌❌✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
UPDATE 语句建议更新表上的“修改时间”列✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
UPDATE 语句检测 SET 多个列之间的分隔符( AND 非法)✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
UPDATE 语句检测表/字段是否存在✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
UPDATE 语句检测是否更新了唯一键✔️✔️✔️✔️✔️✔️❌❌❌❌✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
UPDATE/DELETE 语句必须使用索引✔️✔️❌❌❌❌❌❌❌❌❌❌❌✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
限制 UPDATE/DELETE 单个语句总影响行数✔️✔️❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
OnlineDML:大表数据变更风险检测✔️❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌❌❌❌❌❌
UPDATE不可以更新表上的分区键❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌❌❌❌❌❌❌❌
对象字段禁用 Zerofill 属性✔️❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
禁止事件相关操作✔️❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
禁止自定义函数相关操作✔️❌❌✔️❌❌❌❌✔️✔️✔️❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
禁止存储过程相关操作✔️❌❌✔️✔️❌❌❌❌❌✔️❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
禁止触发器相关操作✔️❌❌✔️✔️❌❌❌❌❌✔️❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
禁止视图相关操作✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
索引限制表索引数量✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
索引需要设置名称✔️✔️✔️❌❌✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制普通索引名格式✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制主键列必须自增✔️✔️❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
限制主键包含列的个数✔️✔️✔️✔️✔️✔️❌❌❌❌✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制主键列类型✔️✔️✔️✔️✔️✔️❌❌❌❌✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制单个索引包含列的个数✔️✔️✔️✔️✔️✔️❌❌❌❌✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制唯一索引名格式✔️✔️✔️✔️✔️✔️❌❌❌❌✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
索引名称不允许重复✔️❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
分区键对应字段必须在主键、唯一键中❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌❌❌❌❌❌❌❌
检查DDL语句中可能存在的冲突❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️❌❌❌❌❌❌❌❌❌
写入INSERT 语句字段名不能重复✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
INSERT 语句字段列表和值列表要匹配✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
INSERT 语句建议指定 INSERT 字段列表✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
INSERT 语句不能为 NOT NULL 列插入 NULL 值✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
INSERT 语句不建议使用 SYSDATE() 函数✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制 INSERT 语句一条 INSERT VALUES 的总行数✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
INSERT 语句检测 INSERT 的表/字段是否存在✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
INSERT/REPLACE必须指定分区键❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌❌❌❌❌❌❌❌
分区键不可写入中文❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️❌❌❌❌❌❌❌❌❌❌
查询(DQL)SELECT 时不建议 GROUP BY 常量✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制 SELECT 语句多表关联的数量✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
SELECT 语句建议包含 WHERE 条件✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制 SELECT 语句 LIMIT 的 OFFSET 大小✔️❌✔️❌❌✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
SELECT 语句不建议对不同的表 GROUP BY 或 ORDER BY✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
SELECT 语句不建议对常量进行 ORDER BY✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
SELECT 语句不建议 ORDER BY 多个字段使用不同方向排序✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
SELECT 语句不建议使用 ORDER BY RAND()✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
SELECT 语句不建议使用 HAVING 子句✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
SELECT 语句不建议使用 UNION✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制 WHERE 条件中 IN 子句包含元素个数✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
WHERE 条件中不建议使用前通配符查找✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
WHERE 条件中不建议索引字段包含数学运算或函数运算✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
WHERE 条件中不建议使用反向查询(NOT IN / NOT LIKE)✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
WHERE 条件中检测没有通配符的 LIKE 语句✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
SELECT 语句不建议 GROUP BY 或 ORDER BY 表达式或函数✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
SELECT 语句不建议使用 *✔️✔️✔️✔️✔️❌❌❌❌❌✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
SELECT语句不建议嵌套多层子语句✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
SELECT 语句必须使用索引✔️✔️❌❌❌❌❌❌❌❌❌❌❌✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
禁止使用非分区键对分片表进行关联❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌❌❌❌❌❌❌❌
WHERE 条件中建议带上分区键❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌❌❌❌❌❌❌❌
查询/变更WHERE 条件中检测字段是否存在隐式类型转换✔️✔️❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
WHERE 条件中检测是否通过 OR 操作符连接过滤条件✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
表(DML)UPDATE/DELETE 语句检测 WHERE 条件是否包含子查询✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制 UPDATE/DELETE 语句 LIMIT 数据量大小✔️✔️❌❌❌❌❌❌✔️✔️❌❌✔️✔️❌❌✔️✔️✔️✔️❌❌❌❌❌❌❌
UPDATE/DELETE 语句检测多表关联语法是否完整(JOIN 遗漏 ON 子句)✔️✔️✔️✔️✔️❌❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
限制 UPDATE/DELETE 语句多表关联的数量✔️✔️✔️✔️✔️❌❌❌✔️✔️✔️✔️✔️✔️✔️❌✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
查询(DML)禁止对 WHERE 条件的分区键进行数学运算和函数运算❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌✔️✔️❌❌❌❌❌❌❌❌❌
-SQL类型风险管控✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️
删除DELETE语句检测表是否存在✔️✔️✔️✔️✔️✔️❌❌✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️✔️❌❌✔️✔️