在 Firebird DB 中创建外键时出错

MrS*_*iMo 1 sql firebird firebird2.5

我有两张桌子:commerciaux 和 production。我想在生产中创建一个链接到表 commerciaux 的外键。

ALTER TABLE PRODUCTION
ADD CONSTRAINT FK_PRODUCTION_1
FOREIGN KEY (NOM_COMMERCIAL)
REFERENCES COMMERCIAUX(NOM_COMMERCIAL)
ON DELETE CASCADE
ON UPDATE CASCADE
Run Code Online (Sandbox Code Playgroud)

当我提交时,我收到错误:

This operation is not defined for system tables.
unsuccessful metadata update.
could not find UNIQUE or PRIMARY KEY constraint in table COMMERCIAUX with specified columns.
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Ari*_*The 5

要求写在错误消息中

在具有指定列的表 COMMERCIAUX 中找不到 UNIQUE 或 PRIMARY KEY 约束。

您必须在表上创建这个或那个约束COMMERCIAUX,以便该列COMMERCIAUX(NOM_COMMERCIAL)获得唯一索引。

请参阅第 5.4.1.7.3 章唯一约束

另请阅读另一章:

5.4.1.7.4 外键 外 键确保参与列只能包含主表中引用列中也存在的值。这些引用的列通常称为目标列。它们必须是目标表中的主键或唯一键。它们不需要定义 NOT NULL 约束,但如果它们是主键,它们当然会有该约束。

如果没有唯一索引,Firebird 无法保证“目标列”中的值是唯一的。然后,如果不保证这些值是唯一的,Firebird 就无法实现多对一关系,即外键。

  • @MrSiMo 那么它不能是外键,根据 FK 的定义 - https://en.wikipedia.org/wiki/Foreign_key 和 https://www.cockroachlabs.com/blog/what-is-a-foreign-key / 和 SQL 标准(但它是商业书籍,不是免费提供的)||| 那么你**真正的**问题是什么?https://xyproblem.info ||| 您是否试图创建一个包含“EXISTS”谓词的“CHECK CONSTRAINT”?||| 为什么从“生产”表到随机每个人和没有人的名字都有一个“链接”?您是否必须将该 FK 链接到 COMMERCIAUX 的 PK 而不是非唯一的“NOM_COMMERCIAL”??? (3认同)