Условный оператор MySQL. Если true, ОБНОВЛЕНИЕ, если false, ВСТАВИТЬ - PullRequest
5 голосов
/ 09 февраля 2011

Я пытаюсь создать более надежные MySQL Запросы и учиться в процессе.В настоящее время мне трудно понять синтаксис ON DUPLICATE KEY и возможные варианты использования.

У меня есть INSERT Запрос, который я хочу INSERT, только если нет записи с таким же ID и имя, в противном случае UPDATE.ID и имя не UNIQUE, но ID проиндексировано. ID не UNIQUE, поскольку оно ссылается на другую запись из другой таблицы, и я хочу иметь несколько записей в этой таблице, которые ссылаются на эту конкретную записьиз другой таблицы.

Как использовать от ON DUPLICATE KEY до INSERT только в том случае, если нет записи с этим ID и имя уже установлено, UPDATE эта запись?

Я могу легко добиться этого с парой QUERIES и затем PHP выполнить IF ELSE часть, но я хочу знать, как LIMIT сумму QUERIES, которую я отправляю на MySQL.

Ответы [ 3 ]

7 голосов
/ 09 февраля 2011

ОБНОВЛЕНИЕ: Обратите внимание, что вам нужно использовать IF EXISTS вместо IS NULL, как указано в исходном ответе.

Код для создания хранимой процедуры для инкапсуляции всей логики и проверки наличия ароматов:

DELIMITER //

DROP PROCEDURE `GetFlavour`//
CREATE PROCEDURE `GetFlavour`(`FlavourID` INT, `FlavourName` VARCHAR(20))
BEGIN
IF EXISTS (SELECT * FROM Flavours WHERE ID = FlavourID) THEN
UPDATE Flavours SET ID = FlavourID;
ELSE
INSERT INTO Flavours (ID, Name) VALUES (FlavourID, FlavourName);
END IF;
END //

DELIMITER ;

ОРИГИНАЛ:

Вы можете использовать этот код. Он проверит существование конкретной записи, и если набор записей равен NULL, он пройдет и вставит новую запись для вас.

IF (SELECT * FROM `TableName` WHERE `ID` = 2342 AND `Name` = 'abc') IS NULL THEN
INSERT INTO `TableName` (`ID`, `Name`) VALUES ('2342', 'abc');
ELSE UPDATE `TableName` SET `Name` = 'xyz' WHERE `ID` = '2342';
END IF;

Я немного устарел в своем синтаксисе MySQL, но этот код должен, по крайней мере, помочь вам, а не использовать ON DUPLICATE KEY.

4 голосов
/ 09 февраля 2011

идентификатор и имя не являются уникальными, но идентификатор индексируется.идентификатор не является уникальным

Как я могу использовать ON DUPLICATE KEY для INSERT, только если нет записи с таким идентификатором и именем, уже установленным, ОБНОВИТЬ эту запись?

Вы можете 'т.ON DUPLICATE KEY UPDATE нужен уникальный или первичный ключ, чтобы определить, какую строку нужно обновить.Вам лучше, если PHP выполнит часть IF ELSE.

edit:

Если комбинация имени и идентификатора IS является уникальной, вы можете создать UNIQUE-индекс из нескольких столбцов.Оттуда вы можете использовать ON DUPLICATE KEY UPDATE.

2 голосов
/ 09 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...