如何使用主键删除表中的行,而不删除其他表外键的值?

时间:2017-06-17 08:57:26

标签: sql database postgresql

我们假设:

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值?

3 个答案:

答案 0 :(得分:0)

您可以删除外键约束ALTER TABLE Sale DROP CONSTRAINT ...然后删除该行......但是存在一致性问题,因为您可以进行涉及未知客户的销售。

答案 1 :(得分:0)

  1. 您不能拥有外键引用,并且没有REFERENCED表中的密钥。 您可以使用' Sam'
  2. 删除FK引用并删除该行
  3. 如果你想保留约束,并且基本没有“Sam'”,请插入NULL代替Sam'。

答案 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无法确保您的参照完整性。你必须自己检查一下。