我有两张桌子:家庭和人。
人员表包含以下字段:
+----+------+-----+--------+-----------+
| id | name | age | gender | family_id |
+----+------+-----+--------+-----------+
族表包含以下字段:
+-----------+
| family_id |
+-----------+
系列'family_id'是人员表中id的外键。
我想在人员表中添加一个新行。
id = 5, name = "Bradd Pit", age = 40, gender = "m"
人员表中的id应该等于族表中的family_id
我是否需要制作两个插入命令?一到家庭餐桌和一对人餐桌?
编辑系列只有一个表,因为当我删除一个系列时 - >所有家庭成员也将被删除
答案 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不在族表中,则需要两个插入。
但是这个设计的一些东西被打破了。如果只有一个字段,则不需要表系列。