2013-09-08 3 views
2

Я понимаю, что в этой же теме много ответов на вопрос SO, но я не могу использовать какую-либо информацию, чтобы выяснить, что не так с моим запросом.SQL - INSERT INTO только в том случае, если запись не существует

Я пытаюсь вставить запись в свою таблицу только в том случае, если запись с теми же database_owner и database_name (эти два из моих имен столбцов) еще не существует.

Я использую запрос:

INSERT INTO users_databases (database_name, database_key, database_secret, database_owner) 
VALUES ('DB1', '263f690d-7ac3-49f2-aa3b-f5672e4639a2', '367123d8-e5a7-46a0-8101-21f39e6ac8d9', '[email protected]') 
WHERE 
    NOT EXISTS 
    (SELECT database_name FROM uses_databases WHERE database_name = 'DB1' AND database_owner = '[email protected]'); 

Но я получаю ошибку Incorrect syntax near the keyword 'WHERE'.

Я хотел бы также отметить, что при выполнении запроса

SELECT database_name 
FROM uses_databases 
WHERE database_name = 'DB1' AND database_owner = '[email protected]' 

делает возвращение рекорд ,

Где я могу ошибиться? Из того, что я читал в других вопросах, это выглядит правильно. Но это, очевидно, нет. :-) Любые советы были бы очень полезны.

+0

возможный дубликат [INSERT INTO, если не существует SQL-сервера] (http://stackoverflow.com/questions/9648934/insert-into-if-not-exists-sql-server) http://stackoverflow.com/ Вопросы/5288283/sql-server-insert-if-not-exists-best-practice – Woot4Moo

+1

Если вы используете предложение WHERE, вы должны использовать SELECT вместо VALUES. –

+0

Посмотрите на http://stackoverflow.com/questions/2522379/atomic-upsert-in-sql-server-2005 для обсуждения того, почему все ответы до сих пор ошибочны. Если это sql 2008, посмотрите инструкцию 'merge'. – Laurence

ответ

17

Самым простым решением было бы что-то вроде этого:

IF NOT EXISTS (SELECT database_name FROM uses_databases WHERE database_name = 'DB1' AND database_owner = '[email protected]') 
    INSERT INTO users_databases (database_name, database_key, database_secret, database_owner) 
    VALUES ('DB1', '263f690d-7ac3-49f2-aa3b-f5672e4639a2', '367123d8-e5a7-46a0-8101-21f39e6ac8d9', '[email protected]'); 
+0

Это было! Наверное, я пытался инвертировать. Благодаря! – Brett

+1

Хорошая статья, чтобы прочитать о самом быстром методе для этого [можно найти здесь] (http://cc.davelozinski.com/sql/fastest-way-to-insert-new-records-where-one-doesnt- уже существует), если вы заинтересованы в скорости или затронули несколько миллионов записей. –

1

Вы можете также сделать

INSERT INTO users_databases (database_name, database_key, database_secret, database_owner) 
SELECT 'DB1', '263f690d-7ac3-49f2-aa3b-f5672e4639a2', 
'367123d8-e5a7-46a0-8101-21f39e6ac8d9', '[email protected]' 
WHERE 
    NOT EXISTS 
    (SELECT database_name 
    FROM uses_databases 
    WHERE database_name = 'DB1' AND database_owner = '[email protected]' 
    ) 
2

Вы можете сделать следующее, должны работать

INSERT INTO users_databases (database_name, database_key, database_secret, database_owner) 
    VALUES ('DB1', '263f690d-7ac3-49f2-aa3b-f5672e4639a2', '367123d8-e5a7-46a0-8101- 21f39e6ac8d9', '[email protected]') 
    WHERE 1 
     NOT IN 
     (SELECT 1 FROM uses_databases WHERE database_name = 'DB1' AND database_owner = '[email protected]');