我有一个这样的架构:
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_id
和target.id
。此查询在我的三种情况中的两种情况下都正常工作(两个有效值,id无效,device_id无效),但后者;当initiator.device_id
是无效(不存在)值时。结果是一个非错误的语句,让我评估受影响的行(0) - 我更希望如果这会作为一个约束违规返回,我能做到吗?
我正在使用PostgreSQL 9.3。
答案 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;
(而不是双表,你应该使用任何只有一行的表。)