我正在尝试创建更强大的MySQL
查询并在此过程中学习。目前,我正在努力掌握ON DUPLICATE KEY
语法和可能的用途。
我的INSERT
查询只有在没有相同INSERT
和名称的记录时才会ID
,否则为UPDATE
。 ID
并且名称不是UNIQUE
,但ID
已被编入索引。ID
不是UNIQUE
,因为它引用了另一个表中的另一条记录而我希望有多个此表中的记录引用另一个表中的一个特定记录。
如果没有ON DUPLICATE KEY
的记录且名称已设置为INSERT
,那么我如何才能ID
使用UPDATE
?
我可以通过几个QUERIES
轻松实现这一点,然后让PHP
执行IF
ELSE
部分,但我想知道如何{{1}我发送给LIMIT
QUERIES
的金额。
答案 0 :(得分:7)
更新:请注意,您需要使用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 ;
<强> ORIGINAL:强>
您可以使用此代码。它将检查是否存在特定记录,如果记录集为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。
答案 1 :(得分:4)
id和name不是唯一的,但id是 索引。 id不是唯一的
如何使用ON DUPLICATE KEY 仅在没有记录时才插入 那个id和名字已经设置了 更新那条记录?
你做不到。 ON DUPLICATE KEY UPDATE需要唯一或主键来确定要更新的行。你最好让PHP做IF ELSE部分。
编辑:
如果name和id的组合应该是唯一的,则可以创建多列UNIQUE索引。从那里你可以使用ON DUPLICATE KEY UPDATE。
答案 2 :(得分:2)
为什么不使用存储过程,然后您可以嵌入所有逻辑,另外还有一个可以在其他应用程序中使用的可重用代码片段(例如存储过程)。最后,这只需要往服务器进行一次往返调用存储过程。