我們想實現的效果是:
合併資料庫的說話,如果出現主鍵重複的情況,首先不報錯。如果可以,則兩條資料都保留,更新其中的一條資料,然後使資料不唯一。
思路一:mysql插入資料時可以關閉主鍵唯一檢測,關閉檢測,等資料庫合併完成,用指令碼或者手動修改主鍵重複的值(資料量比較小時)。(此方法測試了不成功,參照下文做的,mysql版本 5.7.0)
1) 對於myisam型別的表,可以通過以下方式快速的匯入大量的資料。
alter table tblname disable keys;
loading the data
alter table tblname enable keys;
這兩個命令用來開啟或者關閉myisam表非唯一索引的更新。在匯入大量的資料到乙個非空的myisam表時,通過設定這兩個命令,可以提高匯入的效率。對於匯入大量資料到乙個空的myisam表,預設就是先導入資料然後才建立索引的,所以不用進行設定。
而對於innodb型別的表,這種方式並不能提高匯入資料的效率。
2) 對於innodb型別的表,我們有以下幾種方式可以提高匯入的效率:
測試了下,mysql(5.7.0),不論是 innodb還是myisam引擎,參照下文連線中的方法進行唯一性檢測關閉都不成功。
有大牛知道原因可以討論下。。。。。
思路二:插入資料時,忽略掉重複的值,合併完成再將重複的資料二次插入。
建立兩個索引不同的表
create table `myisam` (
`id` int(11) not null auto_increment,
`name` varchar(22) not null,
primary key (`id`)
) engine=myisam default charset=utf8;
create table `innodb` (
`id` int(11) not null auto_increment,
`name` varchar(22) not null,
primary key (`id`)
) engine=innodb default charset=utf8;
插入測試資料
insert into myisam(id,name) values ('1','name1'),('2','name2'),('3','name3');
insert into innodb(id,name) values ('1','name1'),('2','name2'),('3','name3');
思路二: 使用ingore
insert ignore into `mysiam` (id, name)values( '1', 'thomas'),('4','aa');
使用ingore 可以同時插入一條或多條,顯示插入行數。 不報錯。當然也可以 一條一條的插入,顯示的為本條sql插入的情況。
replace:使用replace當插入的記錄遇到主鍵或者唯一鍵重複時先刪除表中重複的記錄行再插入。
replace into mysiam() values(1,1),(1,2),(2,2); ====》它是先插入了(1,1)然後又刪除了(1,1)
on duplicate key update當插入的記錄遇到主鍵或者唯一鍵重複時,會執行後面定義的update操作。相當於先執行insert 操作,再根據主鍵或者唯一鍵執行update操作。
insertinto mysiam() values(1,1),(1,2) on duplicate key
update name1=name1+
1;
insert into tupdate() values(1,1)
updatetupdate
set name1=name1+insert1
where id=
1;
into mysiam() values(1,1),(1,2) on duplicate key
update name1=
values(name1)+
1;
相當於:insertinto tupdate() values(1,1)
update
tupdate
set name1=
2+
1
where id=
1;
insert相當於:into mysiam() values(1,1),(2,1) on duplicate key
update name1=
values(id)+
1;
insertinto tupdate() values(1,1)
update
tupdate
set name1=
2+
1
where id=
1;
主鍵與唯一性索引
其實指定列的索引就相當於對指定的列進行排序,為什麼要排序呢?因為排序有利於對該列的查詢,可以大大增加查詢效率。那麼可能有人認為應該對所有的列排序,這樣就可以增加整個資料庫的查詢效率?這樣的想法是錯誤的,原因是建立索引也是要消耗系統資源的,給每個表裡的每個列都建立索引那麼將對系統造成極大的負擔,那就更...
主鍵與唯一性索引
其實指定列的索引就相當於對指定的列進行排序,為什麼要排序呢?因為排序有利於對該列的查詢,可以大大增加查詢效率。那麼可能有人認為應該對所有的列排序,這樣就可以增加整個資料庫的查詢效率?這樣的想法是錯誤的,原因是建立索引也是要消耗系統資源的,給每個表裡的每個列都建立索引那麼將對系統造成極大的負擔,那就更...
主鍵和唯一性索引的區別
主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵。所謂主鍵就是能夠唯一標識表中某一行的屬性或屬性組,乙個表只能有乙個主鍵,但可以有多個候選索引。因為主鍵可以唯一標識某一行記錄,所以可以確保執行資料更新 刪除的時候不會出現張冠李戴的錯誤。主鍵除了上述作用外,常常與外來鍵構成參照完整性約束,防止出現資料...