Синтаксическая ошибка с IF EXISTS UPDATE ELSE INSERT

Я использую MySQL 5.1, размещенную у моего интернет-провайдера. это мой запрос

mysql_query("
IF EXISTS(SELECT * FROM licensing_active WHERE title_1='$title_1') THEN
    BEGIN
        UPDATE licensing_active SET time='$time' WHERE title_1='$title_1')
    END ELSE BEGIN
        INSERT INTO licensing_active(title_1) VALUES('$title_1')
    END   
") or die(mysql_error());  

Ошибка

... check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS(SELECT * FROM licensing_active WHERE title_1='Title1') THEN ' at line 1

Моя актуальная задача включает

WHERE title_1='$title_1' AND title_2='$title_2' AND version='$version' ...ETC...

но я сократил его, чтобы упростить решение моей проблемы

В моих поисках я продолжаю видеть ссылки на «ОБНОВЛЕНИЕ ДУБЛИРОВАННОГО КЛЮЧА», но не знаю, что с этим делать.


person Openstar63    schedule 15.09.2012    source источник


Ответы (3)


Вот простое и легкое решение, попробуйте.

$result = mysql_query("SELECT * FROM licensing_active WHERE title_1 ='$title_1' ");

if( mysql_num_rows($result) > 0) {
    mysql_query("UPDATE licensing_active SET time = '$time' WHERE title_1 = '$title_1' ");
}
else
{
    mysql_query("INSERT INTO licensing_active (title_1) VALUES ('$title_1') ");
}

Примечание. Хотя этот вопрос относится к 2012 году, имейте в виду, что функции mysql_* больше не доступны, начиная с PHP 7.

person Sohail Ahmed    schedule 15.09.2012
comment
Это работает для меня, спасибо. И кажется простым для понимания и запоминания. Это может быть не суперэффективно, но это еще не приложение с высоким трафиком, поэтому я уверен, что этот метод будет хорош в течение года или более. Спасибо. - person Openstar63; 15.09.2012

Это должно помочь вам:

insert into 
    licensing_active (title_1, time) 
    VALUES('$title_1', '$time') 
    on duplicate key 
        update set time='$time'

Предполагается, что title_1 является уникальным столбцом (принудительно установленным базой данных) в вашей таблице.

Способ работы insert... on duplicate заключается в том, что он сначала пытается вставить новую строку, но если вставка отклонена из-за того, что ее останавливает ключ, вместо этого вы сможете обновить определенные поля.

person Fluffeh    schedule 15.09.2012
comment
Привет Флаффе. title_1 не уникален. Единственный уникальный столбец, который у меня есть, — это идентификатор типа int. Он устанавливается как «auto_increment», «уникальный» и «первичный». Я не обращаюсь к нему напрямую. Я все еще борюсь с той же ошибкой. - person Openstar63; 15.09.2012
comment
Не совсем получилось, поэтому я сделал логику на PHP, как описано в Dark Wish. Спасибо хоть. - person Openstar63; 15.09.2012
comment
у меня работает, когда я удаляю set в конце. то есть INSERT INTO <table> (col1, col2) VALUES('f1','f2') ON DUPLICATE KEY UPDATE col2='fn' - person Raza Ahmed; 06.09.2015
comment
Просто не забудьте использовать предложение WHERE!!! Отсюда: w3schools.com/sql/sql_update.asp The WHERE clause specifies which record or records that should be updated. If you omit the WHERE clause, all records will be updated! - person BamsBamx; 06.10.2015
comment
@BamsBamx: это все одно выражение INSERT. - person Ry-♦; 20.11.2015

Синтаксис вашего запроса неверен. Оформить заказ http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html

Используйте duplicate key syntax для достижения желаемого результата. См. http://dev.mysql.com/doc/refman/5.0/en/insert-select.html

person JvdBerg    schedule 15.09.2012