Intereting Posts

Условная инструкция mySQL. Если true UPDATE, если false INSERT

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

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

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

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

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

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

 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.

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

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

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

редактировать:

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

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