我们假设:
CREATE TABLE Client(
ID_Client int primary key,
Name varchar(20));
CREATE TABLE Sale(
X int primary key,
ID_Client int REFERENCES Client(ID_Client));
INSERT INTO Client VALUES(123456, 'Sam');
INSERT INTO Sale VALUES(1, 123456);
如何删除'Sam'而不删除Sale,并且不会丢失它的FK值?
答案 0 :(得分:0)
您可以删除外键约束ALTER TABLE Sale DROP CONSTRAINT ...
然后删除该行......但是存在一致性问题,因为您可以进行涉及未知客户的销售。
答案 1 :(得分:0)
答案 2 :(得分:0)
ID_Client REFERENCES Client
引入的外键禁止ID_Client
接受Client
中未包含的值。因此,如果没有先删除Sam
- 记录或更改相应的销售记录Sale
以指向其他内容,则无法删除客户记录client_id
。
如果要保存销售记录,可以编写ID_Client REFERENCES Client(ID_Client) ON DELETE SET NULL
,以便DBMS更正任何从记录中对(已删除)主记录的引用并设置从记录的ID_Client
- 值到NULL
。当然,您将丢失(已删除的)客户端记录的ID为123456
的信息,因为这不再是“有效”引用,因此不应出现在从属记录中。
如果您还想保留值123456
,则必须删除外键约束。请注意,您仍然可以加入客户和销售;但DBMS无法确保您的参照完整性。你必须自己检查一下。