Mysql ЕСЛИ НЕ СУЩЕСТВУЕТ, то синтаксис - PullRequest
2 голосов
/ 13 сентября 2011

Мне не удается сейчас создать рабочий запрос MySQL для того, что я хочу. Я подошел так близко, как

IF NOT EXISTS(SELECT * 
              FROM Users 
              WHERE Downloads='c6310e0ae33f9377f6ae7994bbafe6e20113aaf4') 
UPDATE Users 
SET `Downloads`='c6310e0ae33f9377f6ae7994bbafe6e20113aaf4' 
WHERE `User`='andrewfree';

Это не удалось, я читал о INSERT IGNORE INTO, но это тоже не помогло. То, что я пытаюсь сделать, это добавить этот хэш в поле загрузки пользователей, если его нет в таблице ни в каком поле загрузки.

Ответы [ 2 ]

3 голосов
/ 13 сентября 2011

Переместите EXISTS в предложение WHERE:

UPDATE Users
SET    `Downloads`='c6310e0ae33f9377f6ae7994bbafe6e20113aaf4'
WHERE  `User`='andrewfree'
AND    NOT EXISTS(
           SELECT 1
           FROM   Users
           WHERE  Downloads='c6310e0ae33f9377f6ae7994bbafe6e20113aaf4'
       ) 

Или добавьте уникальный ключ в Users.Downloads и используйте UPDATE IGNORE:

ALTER TABLE Users ADD UNIQUE KEY downloads_unique (Downloads);

UPDATE IGNORE Users SET Downloads = 'c63...' WHERE User='andrewfree';

Если строка с этим значением Downloads уже существует, ОБНОВЛЕНИЕ не будет выполнено.

При использовании ключевого слова IGNORE строки, [...] для которых возникают конфликты повторяющихся ключей, не обновляются.

См. ОБНОВЛЕНИЕ синтаксиса .

1 голос
/ 13 сентября 2011
UPDATE Users 
SET `Downloads`='c6310e0ae33f9377f6ae7994bbafe6e20113aaf4' 
WHERE `User`='andrewfree'
AND NOT EXISTS(SELECT * 
              FROM Users 
              WHERE Downloads='c6310e0ae33f9377f6ae7994bbafe6e20113aaf4') 

EDIT:

На самом деле вышеприведенное утверждение выдаст ошибку. Я думаю, что это будет делать (не проверено)

UPDATE Users u1 INNER JOIN Users u2 
                ON u2.Downloads='c6310e0ae33f9377f6ae7994bbafe6e20113aaf4'
SET u1.`Downloads`='c6310e0ae33f9377f6ae7994bbafe6e20113aaf4' 
WHERE u1.`User`='andrewfree'
...