这是 SQLite 的外键约束编辑界面看起来像 Navicat 或 DB Browser for SQLite我结合你的管线代码表/图层表场景逐项解释。一、响应ON UPDATE / ON DELETE 的联动动作这三个复选框分别控制三种触发时机右边下拉框选触发后执行什么动作。三个复选框的含义选项含义ON UPDATE当被引用表图层表的主键/唯一字段被修改时触发。比如把ys_point改名叫ys_pipe_point。ON DELETE当被引用表图层表的记录被删除时触发。比如删掉ys_point这一行。MATCHSQLite 实际支持有限一般不用勾选。它控制复合外键多列匹配规则你是单列外键留空即可。右边下拉框的 5 种动作重点动作含义你的管线场景举例推荐度NO ACTION不做任何特殊处理只要子表代码表还有引用这条记录的数据就阻止 UPDATE/DELETE。行为和不写这个子句基本一样。图层表里删ys_point但代码表里还有101101指向它 → 直接报错删不掉。✅ 默认最安全RESTRICT和 NO ACTION 几乎一样也是阻止删除/修改。区别在于触发时机RESTRICT 更早约束检查更早执行。日常用起来没区别。同上✅ 和 NO ACTION 二选一即可CASCADE级联主表改了/删了子表跟着改/删。图层表把ys_point改名为ys_pipe_point→ 代码表里所有指向ys_point的记录自动同步改成ys_pipe_point。或者删掉图层表ys_point→ 代码表里所有引用它的行整行被删除。⚠️ UPDATE 改名字很实用DELETE 级联删数据很危险慎用SET NULL主表记录被删/改时子表外键字段设为NULL。图层表删掉ys_point→ 代码表里101101的图层字段自动变成空。不会删行。✅ 推荐用这个做 ON DELETESET DEFAULT主表记录被删/改时子表外键字段设为列的默认值。前提是代码表的图层字段设了 DEFAULT ‘unknown’删图层后自动填成unknown。SQLite 对这个支持很弱基本不用。❌ 不推荐给你的场景推荐配置结合你之前说的1个代码对应1个图层ON UPDATE 选 CASCADE图层标识改名时代码表自动跟着改不用手动批量刷。ON DELETE 选 SET NULL图层删了代码表那条要素的图层字段变空而不是把整条要素代码记录删掉删要素代码是要命的。对应建表语句就是FOREIGNKEY(图层)REFERENCES图层表(图层标识)ONUPDATECASCADE-- 图层改名代码表自动同步ONDELETESETNULL-- 图层删除代码表图层字段置空⚠️ 注意如果代码表的图层字段设了 NOT NULLON DELETE SET NULL 会报错。你的场景允许图层为空的话就别加 NOT NULL。二、延迟外键约束DEFERRABLE这两个下拉框控制外键检查在什么时候执行。SQLite 里对应两个子句第一个下拉框DEFERRABLE是否可延迟选项含义DEFERRABLE约束可以被推迟到事务提交时才检查。NOT DEFERRABLE约束不能推迟每条 INSERT/UPDATE/DELETE 语句执行完立刻检查。第二个下拉框INITIALLY初始模式选项含义INITIALLY DEFERRED事务提交时才检查外键。INITIALLY IMMEDIATE每条语句执行时就检查默认行为。实际意义结合你的场景这个功能主要解决插入顺序问题默认NOT DEFERRABLE / IMMEDIATE必须先插图层表再插代码表。如果你先插代码表写了ys_point但图层表还没这行立刻报错。DEFERRABLE INITIALLY DEFERRED你可以在一个事务里先插代码表再插图层表只要提交事务时两边数据对上就行。你需要用吗基本不用管保持默认即可。你的码表是标准配置数据录入流程本来就是先配图层、再录要素代码顺序天然合理。延迟外键主要用于数据迁移/导入时批量倒数据顺序不好控制复杂事务里多张表互相引用A 引用 BB 又引用 A不延迟就插不进去普通业务系统保持默认NOT DEFERRABLE / IMMEDIATE就对了。总结一张图外键约束 ├── 引用表/引用列图层表.图层标识被引用的目标 ├── 响应主表变动时子表怎么办 │ ├── ON UPDATE主表主键被修改时 │ │ └── 推荐 CASCADE —— 图层改名代码表自动同步 │ ├── ON DELETE主表记录被删除时 │ │ └── 推荐 SET NULL —— 图层删了代码表图层字段变空 │ └── MATCH复合外键匹配规则单列外键不勾 └── 延迟外键约束什么时候检查外键 ├── DEFERRABLE默认 NOT DEFERRABLE └── INITIALLY默认 IMMEDIATE └── 普通业务不用改保持默认还有什么不清楚的地方可以继续问。
