外键插入情况



我有两个表:family AND people

people表包含以下字段:

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

家庭表有以下字段:

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

家族'family_id'是一个外键在people表中id。

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

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

people表中的id应该等于family表中的family_id

我需要两个插入命令吗?一张给家人,一张给客人?

edit: family只有一个表,因为当我删除一个家庭->该家庭中的所有成员也将被删除

家族'family_id'是people表中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部分意味着如果值已经在该表中,则不是错误)。但是我不会这样做,在这种情况下运行触发器是不必要的开销。

family只有一个表,因为当我删除一个家庭->该家庭中的所有成员也将被删除

根本不需要第二个family表。的确,外键允许DELETE FROM family WHERE family_id = 123,级联删除会影响people表。

但是如果你没有family表或外键引用它,你仍然可以从people表中删除,事实上,简单地使用DELETE FROM people WHERE family_id = 123会更有效。

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

我假设表中的id实际上意味着family_id。在本例中,如果5不在族表中,则需要两次插入。

但是这个设计出了问题。如果只有一个字段,则不需要表族

相关内容

最新更新