postgresql 根据一个表中的数据对另一个表进行postgres约束

u1ehiz5o  于 2023-01-13  发布在  PostgreSQL
关注(0)|答案(1)|浏览(131)

我有一个包含两个表foofoo_trash的数据库。
两者都有相同的结构,都有一个id(主键),title . foo_trash使用从foo复制的数据填充,语句如下:
INSERT INTO foo_trash (SELECT * FROM foo WHERE id = 253)
我想在表foo_trash上添加一个constraint,这样,如果foo中没有相同的id和title对,就不会向foo_trash中插入行。
我该怎么写呢?

w8f9ii69

w8f9ii691#

给定表foo:

create table foo (
  id int,
  title varchar(50),
  primary key (id, title)
  );

定义表foo_trash以引用您提到的两列:

create table foo_trash (
  id int primary key,
  title varchar(50),
  FOREIGN KEY (id, title) REFERENCES foo (id, title)
  );

现在您可以将数据插入foo:

insert into foo values (1, 'title1');
insert into foo values (2, 'title2');
insert into foo values (3, 'title3');
insert into foo values (253, 'title253');

如果你试图在foo_trash中插入一行,而foo中不存在这一行,你会收到一个错误:

insert into foo_trash values (4, 'title4');

输出:

ERROR:  insert or update on table "foo_trash" violates foreign key constraint "foo_trash_id_title_fkey"
DETAIL:  Key (id, title)=(4, title4) is not present in table "foo".

您可以在foo_trash中插入一行,该行存在于foo:

insert into foo_trash values (3, 'title3');

假设id存在,你可以成功地以select from foo的形式插入foo_trash:

INSERT INTO foo_trash (SELECT * FROM foo WHERE id = 253);

相关问题