小编Ste*_*e D的帖子

“合并” Postgres 表中的两行,带有外键

我使用 PostgreSQL 中的以下两个表来保存我读过的书籍的数据库:

CREATE TABLE authors (
    id SERIAL PRIMARY KEY,
    name text
);

CREATE TABLE books (
    id SERIAL PRIMARY KEY,
    title text,
    author_id integer REFERENCES authors(id) ON UPDATE CASCADE ON DELETE CASCADE,
    UNIQUE(title, author_id)
);
Run Code Online (Sandbox Code Playgroud)

现在,在浏览我的作者列表时,我发现了以下两个条目:

id | name
----------
 1 | Mark Twain
 2 | Samuel Clemens
Run Code Online (Sandbox Code Playgroud)

我想要做的是删除“马克吐温”条目,并有效地更新所有引用“马克吐温”的书籍以引用“塞缪尔克莱门斯”。我知道我可以手动执行此操作,但我想要一个有效的解决方案,无论哪些表正在引用authors(id)

我想过这样做(在交易中):

  1. 将 Mark Twain 更改id为 2,让我们UPDATE CASCADE负责更改引用。
  2. 删除马克吐温条目

但这会遇到一些问题,主要是:

  1. 第一步创建一个重复的主键
  2. 一旦它们都具有相同的 ID,我不确定如何引用要删除的正确行!
  3. DELETE CASCADE让我担心的第二个步骤

还有一个更微妙的问题,可以用我(精心策划的)books表格的一部分来说明:

id | title              | …
Run Code Online (Sandbox Code Playgroud)

postgresql foreign-key referential-integrity postgresql-9.4

7
推荐指数
1
解决办法
4247
查看次数