2011-02-09 47 views
5

我正在尝试创建更强大的MySQL查询和学习过程中。目前我很难掌握ON DUPLICATE KEY的语法和可能的用法。有条件的mySQL语句。如果是真的更新,如果是假INSERT

我有一个INSERT查询,我想INSERT只有当没有记录与ID和名称相同,否则UPDATEID和名称不是UNIQUE,但ID已编入索引。 ID不是UNIQUE,因为它引用另一个表中的另一条记录,并且我想在此表中引用另一个表中的一条特定记录的多条记录。

如何才能使用ON DUPLICATE KEYINSERT只有当没有记录与该ID和名称已设置其他UPDATE该记录?

我可以很容易地与一对夫妇的QUERIES实现这一点,然后有PHPIFELSE一部分,但我想知道如何LIMITQUERIES我发送到MySQL量。

回答

7

更新:请注意,您需要使用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 ; 

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语法有点生疏,但代码至少应该让你大多数的方式存在,而不是使用对重复KEY。

+0

获取此错误:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在第1行的IF(SELECT * FROM flavours WHERE id ='1'和Name ='BerryBlue')IS NULL THEN'附近使用正确的语法 –

+0

@Vitaliy - I'我更新了我的代码。看看能否帮助你。如果不是,请尝试将INSERT语句放在与IF语句相同的行上。 – 2011-02-09 01:38:44

+0

已经试过了。也扭转了逻辑,仍然给我一个语法错误。我甚至用没有运气的静态值替换了所有的PHP变量。 –

2

为什么不只是使用存储过程,那么你可以嵌入所有的逻辑,再加上你可以在其他应用程序中使用的可重用代码片段(例如存储过程)。最后,这只需要一次到服务器的往返调用存储过程。

+0

我对SQL非常陌生,不知道如何创建存储过程。我有很多要学习的。 –

4

id和name不是唯一的,但id是 索引。 ID不是唯一的

我如何使用ON DUPLICATE KEY到 INSERT仅当有与 没有记录该ID和姓名已设置其他 更新记录?

你不行。在DUPLICATE KEY UPDATE上需要一个唯一或主键来确定要更新哪一行。你最好用PHP来做IF ELSE部分。

编辑:

如果名称和ID的组合应该是唯一的,你可以创建一个多列唯一索引。从那里你可以使用ON DUPLICATE KEY UPDATE。

+1

+1来解释这个事实。听起来像他有一个自动增量ID列。在这种情况下,他只需选择然后插入事务。 –

+0

那么这样我就需要两个查询。一个选择字段,然后另一个更新/插入。我试图看看我是否可以在一个查询中做到这一点。我不会自动增加id列。该id引用另一个表上另一个记录的唯一标识。 –

+2

不幸的是没有一个唯一的索引,我不认为你可以。 MySQL内部首先尝试插入,然后捕获“重复密钥错误”,然后进行更新。 REPLACE以同样的方式工作。这听起来可能是id和名字的组合可以组成一个UNIQUE索引?如果是这样,创建组合索引和ON DUPLICATE KEY应该适合你。 – mluebke

相关问题