Mysql 使用外键-无法插入

Mysql 使用外键-无法插入,mysql,database,database-design,foreign-keys,Mysql,Database,Database Design,Foreign Keys,在mySQL数据库中使用外键进行第一次试用,并尝试进行插入,但由于以下原因失败:完整性约束冲突:1452无法添加或更新子行:外键约束失败 这是否意味着外键会限制使用外键关系强制执行的每个表的插入、删除和/或更新 谢谢 更新说明: Products ---------------------------- id | type ---------------------------- 0 | 0 1 | 3 ProductsToCategories -------------

在mySQL数据库中使用外键进行第一次试用,并尝试进行插入,但由于以下原因失败:
完整性约束冲突: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!