我的 Disciples 表里有个 Weapon_ID 列,但我怎么保证填进去的 ID 真的对应一把存在的法宝呢?
这便需要 FOREIGN KEY (外键)。它是一条无形的锁链,将两个表连接起来,保证数据的完整性。
FOREIGN KEY 是一个表中的字段,它指向另一个表中的 PRIMARY KEY。
外键约束能防止非法数据插入外键列,因为它必须是父表中存在的值。
先有 Weapons (父表):
CREATE TABLE Weapons (
W_ID int PRIMARY KEY,
WeaponName varchar(255)
);
再建 Disciples (子表),并加上外键约束:
CREATE TABLE Disciples (
ID int PRIMARY KEY,
Name varchar(255),
Weapon_ID int,
FOREIGN KEY (Weapon_ID) REFERENCES Weapons(W_ID)
);
如果我试图删掉 Weapons 表里的“噬魂棒”,而张小凡手里正拿着它,会发生什么?
天道(数据库)会阻止你!这叫引用完整性保护。除非... 你签了“生死状”。
在建立外键时,你可以规定“当父表数据被删除/更新”时,子表该如何反应:
FOREIGN KEY (Weapon_ID) REFERENCES Weapons(W_ID)
ON DELETE CASCADE
后果: 噬魂棒毁,张小凡亡。如果删除法宝,持有该法宝的弟子也会被自动删除!慎用!
FOREIGN KEY (Weapon_ID) REFERENCES Weapons(W_ID)
ON DELETE SET NULL
后果: 噬魂棒毁,张小凡活着,但手里空了(Weapon_ID 变为 NULL)。