2015-10-15 67 views
0

我嘗試過了幾個小時做一個簡單的MySQL命令,它會無法正常工作。 我有一個數據庫存儲App的包ID,比如'com.android.package'。 它們存儲像這樣:對重複密鑰更新將無法正常工作

| ID | PackageID   | PackageDesc  | 
| 1 | com.android.package | This is a package | 
| 2 | com.android.test2pa | This is package 2 | 

And so on... 

現在我要插入一個新的條目,如果「com.android.package」不存在,如果存在的話,我想什麼也不做......

我嘗試以下操作:

INSERT INTO Packages (PackageID) VALUES ('com.android.package') ON DUPLICATE KEY UPDATE PackageID=VALUES(PackageID) 

但它仍然創造了新的條目,這樣的:

| ID | PackageID   | PackageDesc  | 
| 3 | com.android.package |     | 
| 4 | com.android.package |     | 
| 5 | com.android.package |     | 

我不知道我的錯誤在哪裏。

+0

對於'ON DUPLICATE KEY UPDATE'工作,'PackageID'必須是PK或唯一索引。你的桌子是這種情況嗎? –

+0

@GiorgosBetsos'PackageID'是一個字符串(文本),'ID'是唯一標識符。 – Fusseldieb

+0

在這種情況下'ON DUPLICATE KEY UPDATE'將不起作用,因爲就MySQL而言沒有重複。 –

回答

2

一個提議ON DUPLICATE KEY UPDATE按預期方式工作Packages表架構如下:

CREATE TABLE Packages (
    `ID` INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    `PackageID` VARCHAR(30) NOT NULL, 
    `PackageDesc` VARCHAR (100), 
    UNIQUE(`PackageID`) 
); 

後該語句執行:

INSERT INTO Packages (PackageID, PackageDesc) VALUES 
('com.android.package', 'This is a package') 
ON DUPLICATE KEY UPDATE PackageID=VALUES(PackageID); 

Packages包含以下行:

# ID, PackageID,   PackageDesc 
'1', 'com.android.package', 'This is a package' 

如果你n流執行下面的語句:

INSERT INTO Packages (PackageID, PackageDesc) VALUES 
('com.android.package', 'This is a package2') 
ON DUPLICATE KEY UPDATE PackageID=VALUES(PackageID), PackageDesc=VALUES(PackageDesc); 

Packages包含:

# ID, PackageID,   PackageDesc 
'1', 'com.android.package', 'This is a package2' 

這意味着一個UPDATE通過後者INSERT INTO進行。

Demo here

+0

它仍然重複。當我執行'INSERT INTO包(包ID,PackageDesc)VALUES ( 'com.android.package', '這是一個包2') ON DUPLICATE密鑰更新包ID = VALUES(包ID),PackageDesc = VALUES(PackageDesc);'它創建了一個包含'com.android.package「和」這是一個package2'',但如果我再次執行的條目,它複製一個新的ID此條新條目... – Fusseldieb

+0

@Fusseldieb你有* *改變你表模式爲了使'PackageID'獨一無二? –

+0

我忘記了這一點。 – Fusseldieb