2014-02-04 1 views
0

У меня есть схема, как так:INSERT ... SELECT ошибки на не соответствия критериям запроса

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 invalid, device_id недействителен), так и последний; когда initiator.device_id является недопустимым (несуществующим) значением. Результатом является оператор без ошибок, который оставляет меня для оценки затронутых строк (0). Я бы предпочел, чтобы это вернулось как нарушение ограничения, могу ли я это сделать?

Я использую PostgreSQL 9.3.

ответ

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; 

(вместо двойной таблицы вы должны использовать любую таблицу ровно с одной строки.)

Смежные вопросы