我的外键有问题。在这种情况下,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