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语句来实现呢?
该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)