Mysql 使用外键-无法插入
在mySQL数据库中使用外键进行第一次试用,并尝试进行插入,但由于以下原因失败:Mysql 使用外键-无法插入,mysql,database,database-design,foreign-keys,Mysql,Database,Database Design,Foreign Keys,在mySQL数据库中使用外键进行第一次试用,并尝试进行插入,但由于以下原因失败:完整性约束冲突:1452无法添加或更新子行:外键约束失败 这是否意味着外键会限制使用外键关系强制执行的每个表的插入、删除和/或更新 谢谢 更新说明: Products ---------------------------- id | type ---------------------------- 0 | 0 1 | 3 ProductsToCategories -------------
完整性约束冲突:1452无法添加或更新子行:外键约束失败
这是否意味着外键会限制使用外键关系强制执行的每个表的插入、删除和/或更新
谢谢
更新说明:
Products
----------------------------
id | type
----------------------------
0 | 0
1 | 3
ProductsToCategories
----------------------------
productid | categoryid
----------------------------
0 | 0
1 | 1
产品表具有以下结构
CREATE TABLE IF NOT EXISTS `alpha`.`products` (
`id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT ,
`type` TINYINT(2) UNSIGNED NOT NULL DEFAULT 0 ,
PRIMARY KEY (`id`) ,
CONSTRAINT `funkyfunky`
FOREIGN KEY (`id` )
REFERENCES `alpha`.`ProductsToCategories` (`productid` )
ON DELETE CASCADE,
ON UPDATE CASCADE)
ENGINE = InnoDB;
当存在对子表的外键引用时,不能从父表中删除行。此外,不能在外键列中id无效的子表中插入/更新
编辑:“CONSTRAINT funkyfunky外键(id)”必须在“ProductsToCategories”表中声明,而不是在“Products”表中声明,因为“ProductsToCategories”引用的是“Products”,而不是与您所做的相反。外键强制两个表中的行之间存在有效关系。为了能够将一行插入到包含外键的表中,引用表中必须有一行包含该键,否则插入将失败。与delete相同,当表中仍有外键仍在引用该行时,不能删除该行。阻止在从属表中以包含数据但在引用表中没有关联行的行结束,即违反引用完整性。插入失败,因为插入行中的外键与约束表中的有效键不匹配。例如: 假设您有这两张表:
Employees
----------------------------
EmpID | Name
----------------------------
0 | John
1 | Jane
OfficeAssignments
----------------------------
OfficeID | EmpID
----------------------------
0 | 0
1 | 1
如果在OfficeAssignments.EmpID->Employees.EmpID
上有外键约束,并尝试执行:
INSERT INTO OfficeAssignments (OfficeID, EmpID) VALUES (2,2)
该语句将失败,因为Employees
表中没有EmpID为2的条目
约束旨在确保依赖表始终具有与父表相关的有效数据——在本例中,您将永远不会有一个办公室被分配给系统中不存在的员工,这可能是因为这些办公室不存在(如本例中所示),也可能是因为这些办公室已被删除(因为在首先删除办公室分配记录之前,约束将阻止删除员工记录)
编辑:现在您已经发布了约束,它看起来确实可能是向后设置的。通过将约束放置在
产品
表的定义中,您将使其成为子约束,而产品类别
为父约束。您编写的约束可以理解为,“一个产品在被创建之前必须被分配到一个类别”。我怀疑你的意思是相反的:“一个产品在被分配到一个类别之前必须被创建。要获得该结果,您需要在ProductsToCategories
表上放置约束,将外键设置为productid
,并引用Products.id
您的Products表稍有错误,因为您不需要引用其中的任何内容。引用位于“其他”中表格,并指向主要内容,例如:
create table products (
id int auto_increment,
type int,
primary key (id)
);
create table categories (
id int auto_increment,
name varchar(128),
primary key (id)
)
create table products_to_categories (
product_id int references products,
category_id int references categories
);
事情是这样的。我有一个父表和一个子表。它们都是空的。当我插入父表时,会发生这种情况。奇怪。你确定你正确设置了外键吗?我想你在创建外键时反转了子表和父表。但他说插入在父表中(在你的例子中,雇员)失败。如果外键设置正确,这是不可能失败的。只是注意到(当我开始写文章时,评论还没有设置)。我同意你的回答,听起来约束设置是向后的。嗨!更新了我的第一篇帖子,澄清了一些事情!嗨,Einar,谢谢你的回答。肯定会测试这个,听起来确实是一个解决方案!另一个想法,我希望有一些意见。当产品表使用外键时,删除的产品t还将删除与“products_to_categories”表中的类别的连接。这不是使用外键的最佳方式吗?我的意思是,如果我删除了products_to_categories中的行,我就不希望删除该产品了?这本质上是级联删除。当删除产品时,表中的相应条目会被删除“products\u to\u categories”将被删除。外键当然必须在级联删除的“products\u to\u categories”中声明。您已经添加了级联删除。只需将外键移动到“products\u to\u categories”。太棒了!非常感谢Petar&Einar!