2015-06-25 4 views
0

У меня есть следующий SQL запрос, который будет только вставить, если он уже не существует в таблицеошибка синтаксиса Postgresql для которых не существует

INSERT INTO message_log (message, from_id, to_id, match_id, unix_timestamp, own_account) VALUES('hi', 'tom', 'tom', '55640ec48a2aecab0e3c096c556f5435f4bb054c68930040', 33333, TRUE) 
WHERE NOT EXISTS (SELECT 1 FROM message_log WHERE message = 'hi' AND from_id = 'tom' AND to_id = 'tom' AND match_id = '55640ec48a2aecab0e3c096c556f5435f4bb054c68930040' AND unix_timestamp = 33333) 

Однако я получаю следующую ошибку

ERROR: syntax error at or near "WHERE" 
LINE 2: WHERE NOT EXISTS (SELECT 1 FROM message_log where message = ... 
     ^

Что Я поступаю неправильно?

+1

Там нет 'SELECT' в запросе. – joop

+0

Это не то, что вы можете сделать. По крайней мере, не так. Можете ли вы объяснить, что вы пытаетесь выполнить с помощью инструкции 'INSERT'? – JNevill

+1

@JNevill Я хочу, чтобы строка была вставлена ​​только в том случае, если она еще не существует в таблице – Arya

ответ

1

Вставка записи в таблице только если запись не существует сделано с:

INSERT INTO message_log (message, from_id, to_id, match_id, unix_timestamp, own_account) 
SELECT 'hi', 'tom', 'tom', '55640ec48a2aecab0e3c096c556f5435f4bb054c68930040', 33333, TRUE 
FROM message_log 
WHERE NOT EXISTS (SELECT 1 FROM message_log WHERE message = 'hi' AND from_id = 'tom' AND to_id = 'tom' AND match_id = '55640ec48a2aecab0e3c096c556f5435f4bb054c68930040' AND unix_timestamp = 33333) 

Это немного более многословным, но он должен делать то, что вы хотите. В качестве альтернативы вы можете установить уникальный первичный ключ в таблице, чтобы база данных дала вам smack-down, если вы попытаетесь вставить дубликат ключа. Шесть из них, полдюжины других.

0

Следующий должен делать

INSERT INTO message_log (message, from_id, to_id, match_id, unix_timestamp, own_account) 
SELECT 'hi', 'tom', 'tom', '55640ec48a2aecab0e3c096c556f5435f4bb054c68930040', 33333, TRUE 
WHERE NOT EXISTS (SELECT 1 FROM message_log WHERE message = 'hi' AND from_id = 'tom' 
    AND to_id = 'tom' AND match_id = '55640ec48a2aecab0e3c096c556f5435f4bb054c68930040' 
    AND unix_timestamp = 33333) 

Однако ему не хватает styke: самостоятельный запрос.

Может быть что-то вроде следующего может быть применимо:

INSERT ... 
ON DUPLICATE KEY UPDATE own_account = own_account; 
Смежные вопросы