1. 程式人生 > >mysql唯一索引已有鍵值衝突解決辦法

mysql唯一索引已有鍵值衝突解決辦法



建唯一索引:

alter ignore table tmp_qw2 add unique key uk_uid(user_id);

IGNORE is a MySQL extension to standard SQL. It controls how ALTER TABLE works if there are duplicates on unique keys in the new table or if warnings occur when strict mode is enabled. If IGNORE is not specified, the copy is aborted and rolled back if duplicate-key errors occur. If IGNORE is specified, only the first row is used of rows with duplicates on a unique key. The other conflicting rows are deleted. Incorrect values are truncated to the closest matching acceptable value.

此方法注意點:alter ignore的語法不支援innodb

set old_alter_table = 1;

ALTER IGNORE TABLE tableA ADD UNIQUE INDEX idx_col1_u (col1) 

插入時衝突處理:

insert into t   ... on duplicate key update c1=values

1. 如果存在唯一索引衝突,則更新衝突的記錄。當多個唯一索引記錄衝突時,也只更新一個記錄(挑選規則不確定)

2. audo_increment自增欄位會出現間隙

可設定:innodb_autoinc_lock_mode=0

3 避免在聯合唯一索引中使用,因為它只會更新符合條件:a=1 or b=2 limit 1的第一條資料;至少在5.7版本依然如此,官方文件原文如下:

If a=1 OR b=2 matches several rows, only one row is updated. In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.
這一點在MariaDB並不適用,至少從MariaDB 5.5.32版本開始已經修正此bug或已調整實現邏輯。


4. 在含有多個values()一次性插入多條資料的時候,可以在update語句中用values()來指定欄位,示例:

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

5  在含有auto_increment自增欄位的表中,可以用LAST_INSERT_ID(id)函式來獲取自增欄位最新的值,示例:

INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;