使用引用同一表中PK的外键时发生MYSQL错误



我的外键有问题。在这种情况下,FK引用同一表中的PK。这是创建它的SQL代码:

CREATE TABLE NODOS(
tax_id                      INTEGER NOT NULL,
parent_tax_id               INTEGER,
rank                       VARCHAR(50),
division_id                 INTEGER NOT NULL,
gencode_id             INTEGER NOT NULL,
mitochondrial_genetic_code_id              INTEGER NOT NULL,
comments                    VARCHAR(250),
embl_code                   VARCHAR(5),
inherited_div_flag          INTEGER,
inherited_GC_flag           INTEGER,
hidden_subtree_root_flag    INTEGER,
GenBank_hidden_flag         INTEGER,
inherited_MGC_flag          INTEGER,
CONSTRAINT  PRIMARY KEY(tax_id),
CONSTRAINT  FOREIGN KEY(division_id) REFERENCES divisiones(division_id),
CONSTRAINT  FOREIGN KEY(gencode_id) REFERENCES GENCODES(gencode_id),
CONSTRAINT  FOREIGN KEY (mitochondrial_genetic_code_id) REFERENCES GENCODES(gencode_id),
CONSTRAINT  FOREIGN KEY (parent_tax_id) REFERENCES NODOS(tax_id));

当在MySQL中运行代码时,会出现以下错误:

Database - ERROR - Mysql query error 1452: Cannot add or update a child row: a foreign key constraint fails (`user`.`nodos`, CONSTRAINT `nodos_ibfk_4` FOREIGN KEY (`parent_tax_id`) REFERENCES `nodos` (`tax_id`))

如果任何列中都没有null,为什么会发生这种情况?

您可以通过以下示例更好地理解原因。外键关系类似于父子关系。在现实生活中,你不可能有一个没有父母的孩子,所以这里的实现是一样的。

不能在父项之前创建子项,因为子项将引用不存在的内容。

表创建的正确顺序是查询分区中的父表/引用表,GENCODES表优先等等,加载数据时也是如此。数据必须加载到父表中,然后当您将数据加载到子表中时,就会知道引用数据的来源。我猜您是在将相关数据加载到父对象之前先将数据加载到子对象中。

mysql> 
mysql> CREATE TABLE parent (
->     id INT NOT NULL,
->     PRIMARY KEY (id)
-> ) ENGINE=INNODB;
Query OK, 0 rows affected (0.01 sec)
mysql> 
mysql> 
mysql> 
mysql> 
mysql> CREATE TABLE child (
->     id INT,
->     parent_id INT,
->     INDEX par_ind (parent_id),
->     FOREIGN KEY (parent_id)
->         REFERENCES parent(id)
->         ON DELETE CASCADE
-> ) ENGINE=INNODB;
Query OK, 0 rows affected (0.01 sec)

我们通过在父表之前创建子表来创建具有外键的表,如下所示,类似于数据加载必须先父后子的方式。


mysql> drop table child;
Query OK, 0 rows affected (0.00 sec)
mysql> drop table parent;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE child (
->     id INT,
->     parent_id INT,
->     INDEX par_ind (parent_id),
->     FOREIGN KEY (parent_id)
->         REFERENCES parent(id)
->         ON DELETE CASCADE
-> ) ENGINE=INNODB;
ERROR 1215 (HY000): Cannot add foreign key constraint

相关内容

  • 没有找到相关文章

最新更新