ON CONFLICT 子句中的约束没有关联索引

jla*_*nza 5 postgresql constraint insert errors

我使用 PostgreSQL 13(最新的 dockerized)进行了简单的设置:

    CREATE TABLE stop (
      id INT UNIQUE,
      name TEXT,
      PRIMARY KEY(id)
    );

    CREATE TABLE line (
      id INT UNIQUE,
      name TEXT,
      PRIMARY KEY(id)
    );

    CREATE TABLE line_stops_sequence(
      id SERIAL PRIMARY KEY,
      line INT,
      stop INT,
      CONSTRAINT fk_line FOREIGN KEY(line) REFERENCES line(id),
      CONSTRAINT fk_stop FOREIGN KEY(stop) REFERENCES stop(id)
    );
Run Code Online (Sandbox Code Playgroud)

当我启动下面这句话时

INSERT INTO line(id, name) VALUES (1, 'Line 1');
INSERT INTO stop(id, name) VALUES (2, 'Stop 2');
INSERT INTO line_stops_sequence(line, stop) VALUES (1,1), (1,2) ON CONFLICT ON CONSTRAINT fk_stop DO NOTHING;
Run Code Online (Sandbox Code Playgroud)

我明白了constraint in ON CONFLICT clause has no associated index

我知道我插入的停止 ID 未包含在表中stop。我的想法是我想忽略INSERT有冲突的 s。在示例中,它只有两个项目,但我正在插入大量数据。

如何才能做到无需手动检查查询结果?有没有办法用SQL语句来实现呢?

And*_*y M 8

ON CONFLICT子句严格用于处理唯一违规和排除约束违规错误,如手册中所述。没有类似的语法允许您处理外键违规错误。

您可以通过将检查合并到插入语句中来忽略无效引用,尽管您需要从 切换到INSERT...VALUES才能INSERT...SELECT做到这一点。这是一种方法:

INSERT INTO
  line_stops_sequence(line, stop)
SELECT
  new.line, new.stop
FROM
  (VALUES (1,1), (1,2)) AS new (line, stop)
WHERE
  new.line IN (SELECT id FROM line)
  AND
  new.stop IN (SELECT id FROM stop)
;
Run Code Online (Sandbox Code Playgroud)