我在mysql workbench中创建了如下表:
顺序表:
CREATE TABLE Ordre (
OrdreID INT NOT NULL,
OrdreDato DATE DEFAULT NULL,
KundeID INT DEFAULT NULL,
CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
ENGINE = InnoDB;
产品表:
CREATE TABLE Produkt (
ProduktID INT NOT NULL,
ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
ProduktFarge VARCHAR(20) DEFAULT NULL,
Enhetpris INT DEFAULT NULL,
CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
ENGINE = InnoDB;
和ordrelinje表:
CREATE TABLE Ordrelinje (
Ordre INT NOT NULL,
Produkt INT NOT NULL,
AntallBestilt INT DEFAULT NULL,
CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
ENGINE = InnoDB;
所以当我尝试在 ORDRELINJE
我得到的表:
错误代码:1452。无法添加或更新子行:外键约束失败( srdjank
. Ordrelinje
,约束 Ordrelinje_fk
外键( Ordre
)参考文献 Ordre
( OrdreID
))
我看过其他关于这个主题的帖子,但运气不好。我是在监督什么还是知道该怎么做?
22条答案
按热度按时间zsbz8rwp16#
必须删除子表中与父表主键没有任何对应外键值的数据。或者删除子表中的所有数据,然后插入与父表中主键具有相同外键值的新数据。这应该管用。这里还有一段youtube视频
ct2axkht17#
你的
ORDRELINJE
表链接到ORDER
使用外键约束的表constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)
根据哪个Ordre int NOT NULL,
表的列ORDRELINJE
必须匹配任何Ordre int NOT NULL,
列ORDER
table。现在发生的事情是,当你把新行插入
ORDRELINJE
表,根据fk约束Ordrelinje_fk
它正在检查ORDER
如果OrdreID
是否存在,并且由于它与任何orderid都不匹配,编译器正在抱怨外键冲突。这就是你得到这个错误的原因。外键是另一个表的主键,您可以在任何表中使用它来链接这两个表。此键由创建表时指定的外键约束绑定。对数据的任何操作都不能违反此约束。违反此约束可能会导致这样的错误。
希望我说清楚。
zrfyljdw18#
您应该在每个表中至少插入一个raw(您希望外键指向的表),然后可以插入或更新外键的值
4ngedf3f19#
我也有同样的问题。我在现有的表上创建关系,但是有不同的列值,这些列值被认为是相关的。例如,我有一张table
USERS
有一个专栏USERID
有行1,2,3,4,5
. 然后我又有了一张儿童桌ORDERS
有一列USERID
有行1,2,3,4,5,6,7
. 然后我运行mysql命令ALTER TABLE ORDERS ADD CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS(USERID) ON DELETE SET NULL ON UPDATE CASCADE;
它被拒绝,并显示以下消息:Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (DBNAME1.#sql-4c73_c0, CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS (USERID) ON DELETE SET NULL ON UPDATE CASCADE)
我从orders表中导出数据,然后删除其中的所有数据,再次运行命令,这次成功了,然后用相应的USERID
用户表中的。tnkciper20#
你得到这个约束检查是因为
Ordre
表没有引用OrdreID
在insert命令中提供。插入值
Ordrelinje
,首先必须在中输入值Ordre
表和使用相同OrdreID
在Orderlinje
table。或者可以删除notnull约束并在其中插入null值。
nzk0hqpo21#
您应该将数据从主表中的引用键添加到子表中的外键
这意味着不要向外键添加随机数据، 只需使用主键中可访问的数据
外键数据说明
mxg2im7a22#
在我的情况下,表格是完全一致的。
不管怎样,我得到这个错误是因为我(偶然)在同一个字段上创建了多个fk约束。
我运行以下查询以显示所有键:
我用以下查询删除了错误的:
您也可以在运行此查询时检查它: