我一直在嘗試在mysql表中插入/更新記錄。無法使用ON DUPLICATE KEY,因爲我與主鍵無關。如果存在MySQL更新
基本上我有數據庫
INSERT INTO table (city, state, gender, value) VALUES ("delhi","delhi","M",22)
更新記錄如果城市,州,性別的記錄存在,則簡單地覆蓋該值。
我能做到這一點沒有從編程語言
我一直在嘗試在mysql表中插入/更新記錄。無法使用ON DUPLICATE KEY,因爲我與主鍵無關。如果存在MySQL更新
基本上我有數據庫
INSERT INTO table (city, state, gender, value) VALUES ("delhi","delhi","M",22)
更新記錄如果城市,州,性別的記錄存在,則簡單地覆蓋該值。
我能做到這一點沒有從編程語言
實際發送兩個查詢,你仍然可以使用ON DUPLICATE KEY
,只是下面的列添加一個唯一索引,如
ALTER TABLE tbl_name ADD UNIQUE index_name (city, state, gender)
您的查詢現在將,
INSERT INTO table (city, state, gender, value)
VALUES ('delhi','delhi','M', 22)
ON DUPLICATE KEY UPDATE value = 22
請記住,構建如ON DUPLICATE KEY
和REPLACE INTO
是專旨在防止這一點。阻止來自應用程序層的兩個查詢的唯一方法是聲明一個執行相同操作的數據庫函數。
因此,請添加UNIQUE(city, state, gender)
鍵或跨越相同列的主鍵。兩者之間的差異在於每列的值範圍;主鍵強制NOT NULL
,而UNIQUE
允許列爲NULL
。
區別很微妙,但有時會導致意想不到的結果,因爲NULL
值被認爲是唯一的。例如,假設你在你的數據庫這樣的數據:
nr | name
123 | NULL
如果試圖插入另一個(123, NULL)
當你使用它UNIQUE(nr,name)
不會抱怨;這可能看起來像是bug,但事實並非如此。
非常好的見解。 ++ –
這是否確保城市,州,性別的所有組合都是唯一的? –
是的,100%肯定。 –
@AdityaSingh但只有當你的三列設置爲「NOT NULL」。 –