postgresql 使用EXISTS条件插入多行

vq8itlhq  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(145)

我试图创建一个插入脚本来插入多行,并使用“exists”条件,但它返回一个错误,我不知道为什么,
我有一个这样的查询:

INSERT INTO films (id, code, title, did, date_prod, kind) VALUES
    (1, 'B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    (2, 'HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'),
    (3, 'HG770', 'The Tampopo', 140, DEFAULT, 'Comedy')
WHERE NOT EXISTS (SELECT 1 FROM films WHERE code in ('B6717', 'HG120', 'HG770') 
    AND NOT EXISTS (SELECT 1 FROM films WHERE id in (1,2,3));

我想知道为什么这个查询是不可能的,以及使用多个“存在”条件插入多行的正确方法

zte4gxcn

zte4gxcn1#

您可以通过在code上放置一个唯一约束来实现此操作:

ALTER TABLE films ADD UNIQUE (code);

然后你可以使用INSERT ... ON CONFLICT

INSERT INTO films (id, code, title, did, date_prod, kind) VALUES
   (1, 'B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
   (2, 'HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'),
   (3, 'HG770', 'The Tampopo', 140, DEFAULT, 'Comedy')
ON CONFLICT DO NOTHING;
jdzmm42g

jdzmm42g2#

可以使用upsert操作插入多行,而不使用EXISTS条件
下面的查询可能有助于在表中插入多行。查询如下:

INSERT INTO films (id, code, title, did, date_prod, kind) VALUES
  (1, 'B6717', 'Tampopo', 110, '1985-02-10', 'Comedy')
ON CONFLICT (code) DO UPDATE
  SET title = VALUES(title),
       did = VALUES(did),
       date_prod = VALUES(date_prod),
       kind = VALUES(kind);

下面的查询将尝试用指定的值向films表中插入一行,如果存在冲突,它将在冲突的行上执行更新。

相关问题