外键插入情况

时间:2014-03-08 17:48:11

标签: mysql insert foreign-keys

我有两张桌子:家庭

人员表包含以下字段:

+----+------+-----+--------+-----------+
| id | name | age | gender | family_id |
+----+------+-----+--------+-----------+

族表包含以下字段:

+-----------+
| family_id |
+-----------+

系列'family_id'是人员表中id的外键

我想在人员表中添加一个新行。

id = 5, name = "Bradd Pit", age = 40, gender = "m"

人员表中的id应该等于族表中的family_id

我是否需要制作两个插入命令?一到家庭餐桌和一对人餐桌?

编辑系列只有一个表,因为当我删除一个系列时 - >所有家庭成员也将被删除

2 个答案:

答案 0 :(得分:1)

  

家庭'family_id'是人员表中id的外键。

你有这种关系倒退。 people.family_id应该是family.family_id表的外键。

CREATE TABLE family (
  famliy_id INT PRIMARY KEY
);

CREATE TABLE people (
  id INT PRIMARY KEY,
  name TEXT,
  age TINYINT UNSIGNED,
  gender CHAR(1),
  family_id INT NOT NULL,
  FOREIGN KEY (family_id) REFERENCES family(family_id) ON DELETE CASCADE
);

您的问题的答案是肯定的,您需要单独插入family,然后 之前插入people。在SQL中,INSERT语句一次只能插入一个表。

可能有一种方法在插入people表之前编写触发器,该表使用INSERT IGNORE将family_id插入family,以防它已经存在(和IGNORE) part表示如果该值已经在该表中,则不是错误。但我不会这样做,为这种情况运行触发器是不必要的开销。

  

家庭只有一张桌子,因为我删除了一个家庭 - >所有家庭成员也将被删除

这根本不需要第二个family表。确实,外键允许您DELETE FROM family WHERE family_id = 123,并且级联删除会影响人员表。

但是如果你没有family表或引用它的外键,你仍然可以从people表中删除,实际上简单地{{{ 1}}。

如果你没有告诉我们你的模型有更复杂的东西,比如引用DELETE FROM people WHERE family_id = 123的多个子表,那么使用级联外键来简化删除可能是值得的。

答案 1 :(得分:0)

我在表中假设id实际上意味着family_id。在这种情况下,如果5不在族表中,则需要两个插入。

但是这个设计的一些东西被打破了。如果只有一个字段,则不需要表系列。