---
name: kd-ksql-rules
description: 金蝶 KSQL 规范 - UPDATE/DELETE安全、SELECT *、备份表命名、EXISTS/IN、NULL判断、时间戳
alwaysApply: false
families: [cosmic, enterprise, unknown]
---

# 金蝶 KSQL 规范

> 适用范围：Cosmic（苍穹/星瀚/套件）Deep-DB 严格；企业版 SQL Server 通用。  
> **Skill `kd-ksql` 只服务于 Cosmic**（家族绑定）；企业版 KSQL 也按本规范但路径略有差异。  
> 不要把 Cosmic 特有写法（如 `t_meta_*` 关联、ORM 路由）强行落到企业版场景。

## UPDATE/DELETE 安全

- **必须有 WHERE 子句**：`UPDATE` 或 `DELETE` 语句必须包含 `WHERE` 条件，禁止全表更新/删除
- 数据修复脚本必须先 `SELECT` 验证影响范围，再执行 `UPDATE`/`DELETE`

## SELECT * 禁止

- 禁止 `SELECT *`，必须明确列出字段名
- 例外：临时调试查询可使用

## 备份表命名

- 数据修复前必须创建备份表：`原表名_bak_YYYYMMDD`
- 备份表必须包含原表的索引和约束

## EXISTS 偏好 IN

- 子查询判断存在时，优先使用 `EXISTS` 而非 `IN`
- `EXISTS` 性能更优，尤其在子查询结果集大时

## NULL 判断

- 使用 `IS NULL` / `IS NOT NULL`，禁止 `= NULL` / `!= NULL`
- 金蝶字段默认值可能为 NULL，需注意 `COALESCE` 处理

## 时间戳一致性

- 时间字段格式统一：`YYYY-MM-DD HH:MM:SS`
- 跨数据库时注意时间函数差异：`GETDATE()` (SQL Server) vs `SYSDATE` (Oracle) vs `NOW()` (MySQL)
- 金蝶系统字段 `fmodifytime` / `fcreatetime` 使用数据库原生时间

## 注释与语句边界

- SQL 注释（`--` 或 `/* */`）不影响语句执行
- 多条 SQL 语句以分号分隔时，注意每条语句的完整性
