2013-11-03 32 views
0

我試圖向MySQL表中插入新行,但只有當我插入的值之一不在已經在表中的行中。插入新行,除非其中一個值與另一行匹配?

舉例來說,如果我做的:

insert into `mytable` (`id`, `name`) values (10, `Fred`) 

我希望能夠進行檢查,看是否有其他行的表已name = 'Fred'。如何才能做到這一點?

謝謝!

編輯

我想什麼(不能發佈確切的說法,但這裏有一個代表):

INSERT IGNORE INTO mytable (`domain`, `id`) 
VALUES ('i.imgur.com', '12gfa') 
WHERE '12gfa' not in (
    select id from mytable 
) 

會拋出錯誤:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE '12gfa' not in (select id from mytable)' at line 3 
+0

你嘗試任何方法?你看過「if」關鍵字嗎? – Oded

+0

我試着用'不在'然後做一個選擇,但它似乎沒有工作。 – Jake

+0

我對'if'關鍵字不熟悉 – Jake

回答

1

首先,你的id字段應該是autoincrement,除非它是一個外鍵(但我不能從你插入你的問題的代碼中假設它)。

通過這種方式,您可以確保每行有id的唯一值。

如果不是的話,你應該創建包含你不想複製和使用INSERT IGNORE命令ALL領域的表的主鍵。

Here's a good read關於你想要達到的目標。

+0

現在這是一個不錯的功能。我希望MSSQL有那個! –

+0

澄清,如果你有PK和UK,它適用於兩者嗎?換句話說,如果PK是新的,但英國有衝突,它會不會忽略呢? –

+1

已經有一個自動增量的pk。 'id'用於其他目的。不過謝謝,這個答案幫助我弄清楚我錯過了什麼。我已經在使用'INSERT IGNORE',但無法弄清楚如何確保特定的字段是唯一的。我只是將相應的字段標記爲「UNIQUE」,我之前並不知道它存在。 – Jake

0

你可以使用類似這樣的東西

INSERT INTO someTable (someField, someOtherField) 
VALUES ("someData", "someOtherData") 
ON DUPLICATE KEY UPDATE someOtherField=VALUES("betterData"); 

這將插入一個新行,除非行已經存在一個重複鍵,它會更新它。

+0

我不知道我的理解 - 重複鍵中的數據與插入中的任何數據都不相同。 – Jake

+0

更正了錯誤的聲明。 –

0
DELIMITER | 
CREATE PROCEDURE tbl_update (IN id INT, IN nm VARCHAR(15)) 
BEGIN 
DECLARE exst INT; 
SELECT count(name) INTO exst FROM mytable WHERE name = nm; 
IF exst = 0 THEN 
    INSERT INTO mytable VALUES(id, name); 
END IF; 
END 
| 
DELIMITER ; 

或只是讓屬性名稱爲UNIQUE

相關問題