重要的就是上面提到的 :
INSERT ... SELECT
INSERT ... ON DUPLICATE KEY UPDATE
INSERT ... ON DUPLICATE REPLACE
比如想往表中插入一條數據,如果表中沒有該條數據才插入,如果已經存在該條數據就不插入。
首先,在創建表時,將不需要重復的字段設置為unique,然後在插入時,使用insert ignore語句
MySQL實現(Duplicate key)如果不存在則插入,存在則更新:
INSERT INTO ipstats VALUES(’192.168.0.1′, 1) ON DUPLICATE KEY UPDATE clicks=clicks+1;
例子
代碼如下 復制代碼mysql> insert into `200702` (`domain`, `2nd_domain`, `tld`, `query_ns1`, `query_ns2`, `report_date`) values ('dnspod.com', 'dnspod', 'com', 1000, 2000, '2007-02-04') ON DUPLICATE KEY UPDATE `query_ns1` = `query_ns1` + 1000, `query_ns2` = `query_ns2` + 2000;
Query OK, 2 rows affected (0.01 sec)
例子2
ysql> insert into `200702` (`domain`, `2nd_domain`, `tld`, `query_ns1`, `query_ns2`, `report_date`) values ('dnspod.com', 'dnspod', 'com', 1000, 2000, '2007-02-04') ON DUPLICATE KEY UPDATE `query_ns1` = `query_ns1` + 1000, `query_ns2` = `query_ns2` + 2000;
Query OK, 1 row affected (0.00 sec)
除了使用INSERT ... ON DUPLICATE KEY UPDATE我們還可以使用(insert if not exists)
示例一:插入多條記錄
假設有一個主鍵為 client_id 的 clients 表,可以使用下面的語句:
代碼如下 復制代碼
INSERT INTO clients
(client_id, client_name, client_type)
SELECT supplier_id, supplier_name, supplier_type
FROM suppliers
WHERE not exists (select * from clients
where clients.client_id = suppliers.supplier_id);
示例二:插入單條記錄
INSERT INTO clients
(client_id, client_name, client_type)
SELECT 10345, ’IBM’, ’advertising’
FROM dual
WHERE not exists (select * from clients
where clients.client_id = 10345);
使用 dual 做表名可以讓你在 select 語句後面直接跟上要插入字段的值,即使這些值還不存在當前表中。
測試性能發現如果同樣多的數據使用INSERT ... ON DUPLICATE KEY UPDATE比起not exists是要好很多了,畢竟前者是mysql自帶的一個處理重復數據的語句。