postgresql - 如果删除了具有外键的行,如何在表中保留具有外键值的行?

标签 postgresql

有表1:

CREATE TABLE table1
(
  id serial NOT NULL,
  CONSTRAINT pk_table1_id PRIMARY KEY (id),
)

有表2:

CREATE TABLE table2
(
  id serial NOT NULL,
  fk_1 integer,
  CONSTRAINT fk_to_table1 FOREIGN KEY (fk_1)
      REFERENCES table1 (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION
      NOT VALID
)

当我尝试从 table1 中删除一些行时出现异常:

UPDATE or DELETE in the table "table1" violates the foreign key constraint "fk_to_table1" of the table "table2"

如果删除了带有来自 table1 的外键的行,是否有一些方法可以在 table2 中保留(保存)fk_1 中具有相同值的行(来自 table1 的 id)?

例子: 表一:

id
1
2
3

表 2:

id fk_1
1 | 1
2 | 1
3 | 3
4 | 2

从表 1 中删除第一行后我想看到的内容:

表 1:

id
2
3

表 2:

id fk_1
1 | 1
2 | 1
3 | 3
4 | 2

最佳答案

您可以使用 ON DELETE SET NULL 来做到这一点:

CREATE TABLE table2
(
  id int NOT NULL,
  fk_1 integer,
  CONSTRAINT fk_to_table1 FOREIGN KEY (fk_1)
      REFERENCES table1 (id)
      ON UPDATE CASCADE 
      ON DELETE SET NULL
);

insert into table1 values (1), (2);
insert into table2 values (1,1), (2,1), (3,2), (4,2);

然后如果你运行:

delete from table1
where id = 1;

表 2 将如下所示:

id | fk_1
---+-----
 1 |     
 2 |     
 3 |    2
 4 |    2

在线示例:http://rextester.com/NPUG18060

关于postgresql - 如果删除了具有外键的行,如何在表中保留具有外键值的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50023171/

相关文章:

更新字符串中三个字符的 SQL 语句

java - @Column(unique = true) 产生警告 o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Warning Code: 0, SQLState: 00000

postgresql - JOOQ 和字段值 : BigDecimal to Int

sql - 优化PG查询

java - Flyway 可以从 jar 迁移吗?

javascript - joinmonster 不是一个函数 - GraphQL

postgresql - 将分区 LIST 附加到 postgres 11 中的现有表

sql - TOP n WITH TIES : LIMIT "with ties"? 的 PostgreSQL 等价物

Java SQL "ERROR: Relation "表名“不存在”

java - Glassfish 没有获取 POSTGRES 属性