2011-02-09 82 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

相關問題