Jus*_*tin 5 foreign-key constraint insert referential-integrity
假设我有一个包含数据 A1 和 A2 的表 tbl1,其中 A1 是主键。然后我有另一个表 tbl2,其中包含数据 A3 和 A1,两者一起作为主键,将 A1 引用为来自 tbl1 的外键。
我可以在 tbl2 中插入一个元组,它的 A1 不在 tbl1 中吗?SQL 是否将其作为错误来管理?或者在这种情况下会发生什么?
RTh*_*mas 11
正如评论中所讨论的,违反外键约束将在大多数合法服务器产品上产生错误。 但是,这仅在物理定义了外键的情况下。
逻辑外键可以在没有执行器的情况下存在,在大多数引擎上被称为约束。我见过很多在纸上显示关系的模式,但仔细检查后发现逻辑关系实际上并未由外键约束强制执行。当关系被正确索引时,这对于检查数据完整性目的以及查询性能很重要。
定义约束后,如果您违反该约束,以下每个服务器产品都会产生错误。
MySQL:
violation of FOREIGN KEY constraint "<name of constraint>" on table "<your table>".
注意 MySQL 目前只支持 InnoDB 和 Falcon 引擎本身的外键约束
SQL 服务器:
statement conflicted with the FOREIGN KEY constraint "<name of contraint>". Conflict occured in database <your database>
邮政:
insert or update on table "<your table>" violates foreign key constraint
"<constraint name>"
甲骨文:
ORA-02291: integrity constraint (<schema.constraint>) violated - parent key not found
Sybase 的消息可能与 SQL Server 相同,我知道 DB2 强制执行它。 尽管错误消息没有识别约束,但SQLite 也能做到。
请注意,一旦存在依赖于密钥的子项,如果您尝试删除父项,这些引擎也会引发错误。
另一个提示:
当您查看这些错误时,您也会发现一个好的开发策略。以一种易于追溯到所涉及的表的方式命名您的约束,因为几乎所有这些表都在错误中标识了约束名称。