2016-05-14 3 views
2

Не может показаться, что простая инструкция if существует для работы в mysql, есть ли возможная причина, почему она просто не сработает?Операция IF EXISTS, дающая ошибку # 1064

IF EXISTS(SELECT * FROM Cookies WHERE VALUED ='2601:2c0:8403:5320:947e:a047:6e0f:e23a') 
BEGIN 
THEN 
END; 
    UPDATE Cookies SET Amount = Amount + '1' WHERE VALUED ='2601:2c0:8403:5320:947e:a047:6e0f:e23a' 

ELSE 
BEGIN 

    INSERT INTO Cookies (Valued, Amount) Values ('2601:2c0:8403:5320:947e:a047:6e0f:e23a', '1') 
END; 
+0

IF EXISTS (SELECT * FROM Cookies WHERE VALUED = '2601: 2c0: 8403: 5320: 947e: a047: 6e0f: e23a') BEGIN THEN END; UPDATE Печенье SET Сумма = сумма + '1', ГДЕ значной = '2601: 2C0: 8403: 5320: 947e: A047: 6e0f: E23A' ИНАЧЕ НАЧАТЬ INSERT в печенье (оцененный, сумма) значений ('2601 : 2c0: 8403: 5320: 947e: a047: 6e0f: e23a ',' 1 ') END; END IF; –

+0

Редактируйте свой вопрос, не публикуйте код в комментарии .. Код в комментарии нечитабелен. – scaisEdge

+0

http://stackoverflow.com/questions/5528854/usage-of-mysqls-if-exists – Pevara

ответ

0

Вы, кажется, перепутали порядок then и begin ключевых слов:

IF EXISTS(SELECT * FROM Cookies WHERE VALUED ='2601:2c0:8403:5320:947e:a047:6e0f:e23a') 
THEN -- Here! 
BEGIN 
    UPDATE Cookies SET Amount = Amount + '1' WHERE VALUED ='2601:2c0:8403:5320:947e:a047:6e0f:e23a' 
END;  
ELSE 
BEGIN 
    INSERT INTO Cookies (Valued, Amount) Values ('2601:2c0:8403:5320:947e:a047:6e0f:e23a', '1') 
END; 

EDIT:
Предполагая, что valued является основным (или даже просто уникальным) ключом, было бы проще использовать оператор вставки с on duplicate пункта:

INSERT INTO cookies (valued, amount) 
VALUES ('2601:2c0:8403:5320:947e:a047:6e0f:e23a', 1) 
ON DUPLICATE KEY UPDATE amount = amount + 1; 
+0

Я пробовал это раньше, все еще не работает .... –

+0

Это все еще не имеет смысла ... 'THEN BEGIN END UPDATE ELSE'? Разумеется, 'UPDATE' должен быть до' END', а не после? – MatBailie

+0

@MatBailie yikes! Попал в коп-и-ошибку ... Конечно, он должен быть затем-begin-update-end-else-insert-end (отредактирован и исправлен). – Mureinik

2

Деле т.е все НАЧАТЬ и END - вы их не нужно, и вы использовали их неправильно в любом случае:

IF EXISTS(SELECT * FROM Cookies WHERE VALUED ='2601:2c0:8403:5320:947e:a047:6e0f:e23a') THEN 
    UPDATE Cookies SET 
    Amount = Amount + '1' 
    WHERE VALUED ='2601:2c0:8403:5320:947e:a047:6e0f:e23a' 
ELSE 
    INSERT INTO Cookies (Valued, Amount) Values 
    ('2601:2c0:8403:5320:947e:a047:6e0f:e23a', '1'); 
END IF; 

Если VALUED является первичным ключом, вы можете сделать это гораздо проще:

insert into Cookies (Valued, Amount) values 
('2601:2c0:8403:5320:947e:a047:6e0f:e23a', 1) 
on duplicate key update Amount = Amount + 1; 
+0

# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с IF EXISTS (SELECT * FROM Cookies WHERE VALUED = '2601: 2c0: 8403: 5320: 947e: a047: 6e0' в строке 1 –

+1

@caleb вы не можете просто выполнить его как самостоятельный запрос. 'IF' должен находиться в хранимой процедуре. – Bohemian

+0

Как использовать этот запрос без использования хранимой процедуры. Простое выполнение. – Amee