INSERT ... SELECT到非匹配查询条件的错误

时间:2014-02-04 22:05:10

标签: sql postgresql

我有一个这样的架构:

CREATE TABLE user (
    id uuid NOT NULL,
    device_id uuid PRIMARY KEY NOT NULL 
); 
ALTER TABLE user ADD CONSTRAINT unique_ids UNIQUE (id);


CREATE TABLE hit (
    initiator uuid NOT NULL,
    target uuid NOT NULL 
);


ALTER TABLE hit ADD CONSTRAINT initiator_fk FOREIGN KEY (initiator) REFERENCES user (id);          
ALTER TABLE hit ADD CONSTRAINT target_fk FOREIGN KEY (target) REFERENCES user (id); 
ALTER TABLE hit ADD CONSTRAINT unique_hits UNIQUE (initiator, target);

INSERT语句,我想插入hit

INSERT INTO hit (initiator, target) 
SELECT user.id, $1 
FROM user 
WHERE user.device_id = $2;

因此当一个user希望另外hit时,我手头有initiator.device_idtarget.id。此查询在我的三种情况中的两种情况下都正常工作(两个有效值,id无效,device_id无效),但后者;当initiator.device_id是无效(不存在)值时。结果是一个非错误的语句,让我评估受影响的行(0) - 我更希望如果这会作为一个约束违规返回,我能做到吗?

我正在使用PostgreSQL 9.3。

1 个答案:

答案 0 :(得分:0)

也许是这样的?

INSERT INTO hit (initiator, target) 
SELECT coalesce(user.id,0), coalesce($1,0)
FROM dual left join user on 1=1
WHERE user.device_id = $2;

(而不是双表,你应该使用任何只有一行的表。)