我有两个表: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不在族表中,则需要两次插入。
但是这个设计出了问题。如果只有一个字段,则不需要表族