SQL 是否在插入方面管理外键约束?

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 也能做到。

请注意,一旦存在依赖于密钥的子项,如果您尝试删除父项,这些引擎也会引发错误。

另一个提示

当您查看这些错误时,您也会发现一个好的开发策略。以一种易于追溯到所涉及的表的方式命名您的约束,因为几乎所有这些表都在错误中标识了约束名称。