避免重複紀錄

  1. 資料表出現重複的紀錄是被允許的,但有時必須避免或移除。如果要避免寫入重複紀錄,可於產生資料表時,定義主鍵列或不重複列。以下例子建立資料表 person,共有三個欄位,其中 last_name, first_name 組合成主鍵。
    [root@kvm8 ~]# mysql -s -uroot -p123qwe
    mysql> use dyw;
    mysql> CREATE TABLE person
        -> (
        -> first_name CHAR(20) NOT NULL,
        -> last_name CHAR(20) NOT NULL,
        -> gender CHAR(10),
        -> PRIMARY KEY (last_name, first_name)
        -> );
    mysql>
    
  2. 使用 INSERT IGNORE 語法於資料表 person 新增一筆紀錄並查詢。
    mysql> INSERT IGNORE INTO person (last_name, first_name)
        -> values('Wang', 'De-Yu');
    mysql> select * from person;
    first_name	last_name	gender
    De-Yu	Wang	NULL
    mysql>
    
  3. 直接使用 INSERT 語法新增紀錄時,若此紀錄已存在,因為有設定主鍵,其具不重複性,所以出現紀錄重複的錯誤訊息。
    mysql> INSERT INTO person (last_name, first_name) 
        -> values('Wang', 'De-Yu');
    ERROR 1062 (23000): Duplicate entry 'Wang-De-Yu' for key 'PRIMARY'
    
  4. INSERT IGNORE 語法新增紀錄時,若此紀錄已存在,則忽略不動作。因此,再執行一次沒有出現錯誤訊息,但查詢結果還是只有一筆。
    mysql> INSERT IGNORE INTO person (last_name, first_name)
        -> values('Wang', 'De-Yu');
    mysql> select * from person;
    first_name	last_name	gender
    De-Yu	Wang	NULL
    mysql>
    
  5. REPLACE 語法新增紀錄時,若此紀錄已存在,則取代原紀錄。
    mysql> REPLACE INTO person (last_name, first_name)
        -> values('Lin','Linda');
    mysql> select * from person;
    first_name	last_name	gender
    Linda	Lin	NULL
    De-Yu	Wang	NULL
    mysql>
    
  6. 使用 INSERT IGNORE 語法新增紀錄,此紀錄已存在,但要新增的非主鍵紀錄資料不同,還是忽略不新增。
    mysql> INSERT IGNORE INTO person (last_name, first_name, gender)
        -> values('Lin','Linda','F');
    mysql> select * from person;
    first_name	last_name	gender
    Linda	Lin	NULL
    De-Yu	Wang	NULL
    mysql>
    
  7. 使用 REPLACE 語法新增紀錄,此紀錄已存在,但要新增的非主鍵紀錄資料不同,會以新的資料取代舊紀錄。
    mysql> REPLACE INTO person (last_name, first_name,gender)
        -> values('Lin','Linda','F');
    mysql> select * from person;
    first_name	last_name	gender
    Linda	Lin	F
    De-Yu	Wang	NULL
    mysql>