【问题标题】:What's wrong with my "on delete set default"?我的“删除设置默认值”有什么问题?
【发布时间】:2020-11-25 01:11:41
【问题描述】:

我在 Postgresql 13 上。

如果我从“父表”的建筑物中删除,我想要一个假定默认值“1”的表(房间) 这是我的sql代码

DROP TABLE rooms;
DROP TABLE buildings;

CREATE TABLE buildings (
    building_no INT default 1 primary key,
    building_name VARCHAR(255),
    address VARCHAR(255));

CREATE TABLE rooms (
    room_no INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    room_name VARCHAR(255),
    building_no INT default 1,
    FOREIGN KEY (building_no) REFERENCES buildings (building_no) ON DELETE SET default );

我将值插入到表中

   insert into buildings values (1,'Building1','Street 33');    
   insert into buildings values (2,'Build-B','Street 34');
   insert into rooms values (1,'Room 1',1);
   insert into rooms values (2,'Room 2',2);

然后我从建筑物中删除

delete from buildings;

当我从建筑物中删除而不是按照我的要求设置默认值 1 时,将值设置为 NULL。

test=> select * from rooms;
 room_no | room_name | building_no 
---------+-----------+-------------
       1 | Room 1    |            
       2 | Room 2    |        

我的 sql 代码有什么问题?

【问题讨论】:

  • 我猜,但我不知道如何删除所有建筑物并期望 Table.building_no 更新为 1,因为没有具有此 ID 的建筑物(即设置默认值会违反外键)。也许尝试删除仅建设 2,看看会发生什么。
  • 我无法重现此内容。我得到了预期的ERROR: update or delete on table "buildings" violates foreign key constraint "rooms_building_no_fkey" on table "rooms"DETAIL: Key (building_no)=(1) is still referenced from table "rooms".。你用的是什么版本?这是标准的 PostgreSQL 吗?
  • 是的,是 Centos 7 上的标准 Postresql 13

标签: sql postgresql


【解决方案1】:

通过删除建筑物中的所有记录,房间表中的默认值 1 违反了 FK 约束。因此,它会将其设置为 NULL。如果您要删除除建筑物 1 之外的所有建筑物,您将不会遇到您所描述的行为。

【讨论】:

  • 这没有意义。我预计会出现错误,并将其他所有内容视为错误。我得调查一下。
  • 我无法重现该问题,请参阅我对该问题的评论。
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
相关资源
最近更新 更多