next up previous contents
Next: 計算重複紀錄 Up: Duplicates 重複紀錄 Previous: Duplicates 重複紀錄   Contents   DYWANG_HOME

避免重複紀錄

  1. 資料表出現重複的紀錄是被允許的,但有時必須避免或移除。如果要避免寫入重複紀錄,可於產生資料表時,定義主鍵列或不重複列。
  2. 登入 mariadb。
    [root@kvm8 ~]# mycli -S /var/lib/mysql/mysql.sock -uroot -p123qwe 
    mariadb 10.3.11-MariaDB
    mycli 1.20.1
    Chat: https://gitter.im/dbcli/mycli
    Mail: https://groups.google.com/forum/#!forum/mycli-users
    Home: http://mycli.net
    Thanks to the contributor - Steve Robbins
    
  3. 使用資料庫 dyw。
    mariadb root@localhost:(none)> use dyw;                                         
    You are now connected to database "dyw" as user "root"
    Time: 0.001s
    
  4. 以下例子建立資料表 person,共有三個欄位,其中 lname,fname 組合成主鍵。
    mariadb root@localhost:dyw> create table person(fname char(20) not null,lname ch
                                ar(20) not null, sex char(10), primary key(lname,fna
                                me));                                               
    Query OK, 0 rows affected
    Time: 0.041s
    
  5. 使用 INSERT IGNORE 語法於資料表 person 新增一筆紀錄並查詢。
    mariadb root@localhost:dyw> insert ignore into person(lname,fname) values('Wang'
                                ,'De-Yu');                                          
    Query OK, 1 row affected
    Time: 0.004s
    mariadb root@localhost:dyw> select * from person;                               
    +-------+-------+--------+
    | fname | lname | sex    |
    +-------+-------+--------+
    | De-Yu | Wang  | <null> |
    +-------+-------+--------+
    
    1 row in set
    Time: 0.020s
    
  6. 直接使用 INSERT 語法新增紀錄時,若此紀錄已存在,因為有設定主鍵,其具不重複性,所以出現紀錄重複的錯誤訊息。
    mariadb root@localhost:dyw> insert into person(lname,fname) values('Wang','De-Yu
                                ');                                                 
    (1062, "Duplicate entry 'Wang-De-Yu' for key 'PRIMARY'")
    
  7. INSERT IGNORE 語法新增紀錄時,若此紀錄已存在,則忽略不動作。因此,再執行一次沒有出現錯誤訊息,但查詢結果還是只有一筆。
    mariadb root@localhost:dyw> insert ignore into person(lname,fname) values('Wang'
                                ,'De-Yu');                                          
    Query OK, 0 rows affected
    Time: 0.006s
    mariadb root@localhost:dyw> select * from person;                               
    +-------+-------+--------+
    | fname | lname | sex    |
    +-------+-------+--------+
    | De-Yu | Wang  | <null> |
    +-------+-------+--------+
    
    1 row in set
    Time: 0.020s
    
  8. REPLACE 語法新增紀錄時,若此紀錄已存在,則取代原紀錄。
    mariadb root@localhost:dyw> replace into person(lname,fname) values('Lin','Linda
                                ');                                                 
    Query OK, 1 row affected
    Time: 0.004s
    mariadb root@localhost:dyw> select * from person;                               
    +-------+-------+--------+
    | fname | lname | sex    |
    +-------+-------+--------+
    | Linda | Lin   | <null> |
    | De-Yu | Wang  | <null> |
    +-------+-------+--------+
    
    2 rows in set
    Time: 0.023s
    
  9. 使用 INSERT IGNORE 語法新增紀錄,此紀錄已存在,雖然要新增的非主鍵 sex 資料不同,還是忽略不新增。
    mariadb root@localhost:dyw> insert ignore into person(lname,fname,sex) values('L
                                in','Linda','F');                                   
    Query OK, 0 rows affected
    Time: 0.002s
    mariadb root@localhost:dyw> select * from person;                               
    +-------+-------+--------+
    | fname | lname | sex    |
    +-------+-------+--------+
    | Linda | Lin   | <null> |
    | De-Yu | Wang  | <null> |
    +-------+-------+--------+
    
    2 rows in set
    Time: 0.024s
    
  10. 使用 REPLACE 語法新增紀錄,此紀錄已存在,但要新增的非主鍵 sex 紀錄資料不同,會以新的資料取代舊紀錄。
    mariadb root@localhost:dyw> replace into person(lname,fname,sex) values('Lin','L
                                inda','F');                                         
    Query OK, 1 row affected
    Time: 0.004s
    mariadb root@localhost:dyw> select * from person;                               
    +-------+-------+--------+
    | fname | lname | sex    |
    +-------+-------+--------+
    | Linda | Lin   | F      |
    | De-Yu | Wang  | <null> |
    +-------+-------+--------+
    
    2 rows in set
    Time: 0.025s
    



De-Yu Wang 2020-04-07