2017-01-28 82 views
1

否則更新在這樣的表:MySQL表插入,如果不存在非唯一列

ID | user_ID | name  | value 
1 | 36  | order | {1, 'asc'} 
2 | 36  | colvis | 0,1,2,4,7 
3 | 36  | colorder | 0,1,2,4,3,5,6,7 
4 | 37  | colvis | 0,1,2,4,5,7 

只有ID是唯一的AUTO_INCREMENT,我需要插入新行USER_ID = 36和colvis = 'something',如果該用戶的'colvis'行不存在,即執行'INSERT IF NOT EXIST user_ID = x AND name = y ELSE UPDATE'查詢。例如,如果我有user_ID = 36和name ='colorder',它應該更新第3行,但用user_ID = 37和name ='colorder'它應該插入新行。與user_ID = 36和name ='filter'相同,它應該插入一個新行。

它可以與

$exist = $sql->Query("SELECT * FROM test WHERE user_ID = 36 AND name='colvis'"); 
if ($exist) { 
    //UPDATE 
} else { 
    // INSERT 
} 

做,但不是還有一個班輪?

我看着Insert into a MySQL table or update if existsMySQL procedure to create or update a row in a tableMySql Insert if not exist two column pair otherwise update,但那些不適用,除非我的'user_ID'和'name'列是唯一的,是嗎?

+1

見INSERT ... ON DUPLICATE KEY - 和規範化讀了太多 – Strawberry

+0

檢查這個https://dev.mysql.com/doc/refman/ 5.7/en/insert-on-duplicate.html –

+0

@Strawberry我誤以爲INSERT ... ON DUPLICATE KEY只有在列中有唯一值時才起作用?規範化意味着什麼? – Konservin

回答

2

您正在尋找insert . . . on duplicate key update。但首先,你需要一個唯一索引:

create unique index unq_test_userID_name on test(user_ID, name) 

然後,你可以做一個插入:

insert into test(user_ID, name, value) 
    values (36, 'colvis', '3') 
    on duplicate key update value values(val); 

這裏一個重要的提醒:在逗號分隔的列表中存儲多個值幾乎都不是正確的事去做。這條規則很少有例外,這就是爲什麼我回答了這個問題。

正確的解決方案可能是一個聯結表,TestValues,每個「測試」一行,每個「值」一行。在這種情況下,你想要做什麼是很容易:

insert into TestValues(test_id, value) 
    values (test_id, val); 
+0

如果我嘗試向user_ID添加唯一索引,phpMyAdmin會給出錯誤「#1062 - 關鍵'user_ID'的重複條目'36'」。 至於存儲逗號分隔列表:它用於存儲註銷後的DataTable首選項,主要是數組。 – Konservin

+0

@Konservin。 。 。唯一的索引有兩個鍵,而不是一個。看看答案中的例子。 –

+0

我的不好。 Still: 插入測試(user_ID,name,val) 值(36,'colvis','3') 重複鍵更新集val = concat(val,',',values(val)); 給出錯誤「#1064 - 你的SQL語法有錯誤;檢查與你的MySQL服務器版本相對應的手冊,以便在'set val = concat(val,','values(val))附近使用正確的語法'在第3行' INSERT INTO AK_user_vars(user_ID,name,value)VALUES(36,'colvis','3,5,6,7,9') ON DUPLICATE KEY UPDATE user_ID = 36,name ='colvis ',value ='3,5,6,7,10'; 不會給出錯誤,但不會更新。 – Konservin

相關問題