MySQL在外键插入后添加主键

时间:2018-01-26 10:14:44

标签: mysql innodb

我有两个表( A B ),其中包含从 B A 的外键。 所以 A 是我的父表, B 是我的孩子。

我现在在 A 中存在父行之前在 B 中插入一行。所以我将外键设置为我知道父 A 将具有的ID,但是现有的权利不知道。为了达到这个目的,我使用选项' SET foreign_key_checks = 0',它允许在子 B 中设置外键,而不会在父 A中显示密钥的外观即可。

我的问题是,如果我在 A 中添加缺少主键的行,会发生什么。将外键< - >主键连接工作,它会像正常一样快吗?或者我必须删除fk密钥并重建它?

我使用InnoDB和MySQL 5.5。

......我知道这可能是非常糟糕的做法...

或简称:

我有一个父表和一个子表,由外键链接。我先添加孩子,如果我以后添加父母会怎么样?

3 个答案:

答案 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]
)