我有两个表( A , B ),其中包含从 B 到 A 的外键。 所以 A 是我的父表, B 是我的孩子。
我现在在 A 中存在父行之前在 B 中插入一行。所以我将外键设置为我知道父 A 将具有的ID,但是现有的权利不知道。为了达到这个目的,我使用选项' SET foreign_key_checks = 0',它允许在子 B 中设置外键,而不会在父 A中显示密钥的外观即可。
我的问题是,如果我在 A 中添加缺少主键的行,会发生什么。将外键< - >主键连接工作,它会像正常一样快吗?或者我必须删除fk密钥并重建它?
我使用InnoDB和MySQL 5.5。
......我知道这可能是非常糟糕的做法...
或简称:
我有一个父表和一个子表,由外键链接。我先添加孩子,如果我以后添加父母会怎么样?
答案 0 :(得分:0)
我的问题是,如果我在A中添加行,会发生什么 缺少主键。将外键< - >主键连接 工作,它会像正常一样快吗?或者我必须删除fk键 并重建它?
如果要将缺失记录添加到父表中,FK约束将按原样运行。您实际上将解决数据不一致问题。 无需重新创建FK。
答案 1 :(得分:0)
我自己通过创建一个例子来尝试。
CREATE TABLE `parent` (
`idparent` int(11) NOT NULL,
PRIMARY KEY (`idparent`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `parent` (
`idparent` int(11) NOT NULL,
PRIMARY KEY (`idparent`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
SET foreign_key_checks = 0;
INSERT INTO child (idchild, parentid) VALUES (1,1),(2,2),(3,3),(4,4),(5,5);
SET foreign_key_checks = 1;
INSERT INTO parent (idparent) VALUES (1),(2),(3),(4),(5);
接下来,我使用explain来获取一个想法,如果使用索引:
EXPLAIN SELECT * from parent p
join child c on c.parentid = p.idparent;
+----+-------------+-------+-------+-----------------+-----------------+---------+----------------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-----------------+-----------------+---------+----------------------+------+--------------------------+
| 1 | SIMPLE | p | index | PRIMARY | PRIMARY | 4 | NULL | 5 | Using index |
| 1 | SIMPLE | c | ref | fk_parentid_idx | fk_parentid_idx | 5 | remove_me.p.idparent | 1 | Using where; Using index |
+----+-------------+-------+-------+-----------------+-----------------+---------+----------------------+------+--------------------------+
所以看起来它使用索引,尽管最初没有设置外键。因此,它应该至少在速度上没有问题。
答案 2 :(得分:-1)
INSERT INTO `area` (
`area_id` PRIMARY KEY,
`area_name`,
`chemist_id`FOREIGN KEY
)
VALUES (
[value-1],
[value-2],
[value-3]
)