mysql判重插入

2021-09-02 19:25:03 字數 1475 閱讀 8501

表結構:

create table `test` (

`id` int(11) not null auto_increment,

`name` varchar(255) character set latin1 default null,

`code` varchar(10) character set latin1 default null,

`quota_owner` varchar(32) character set latin1 default null comment '指標owner',

`is_deleted` int(1) default '0',

primary key (`id`),

unique key `name_code_uniq_index` (`name`,`code`,`is_deleted`) using btree

) engine=innodb auto_increment=17 default charset=utf8

其中name, code,is_deleted 做了唯一索引,插入時,不允許這三列插入重覆記錄,下面有4種方法

第一種用on duplicate key update,如果存在,則更新

insert into test(name,code,quota_owner) 

values('qq','a4','') on duplicate key update quota_owner='jason' ;

第二種用replace into,如果存在則覆蓋

replace into test(name,code,quota_owner) values('qq','a4','2');

第三種 insert ignore into,如果存在不處理

insert ignore into test(name,code,quota_owner) values('qq','a4','1');

第四種與第三種效果一樣,用not exists

insert into test(name,code,quota_owner) 

select 'qq','a4','5' from dual where not exists(select name from test where name='qq' and code='a4')

上面是在mysql資料庫層做的防止重複插入的處理,另外注意,如果在程式中使用synchronized之類的做併發處理,在單機上可以,但是如果部署到多台伺服器,由於該鎖的物件只屬於當前jvm,其他機器不受影響,所以並不能防止重複插入。此時,需要使用分布式鎖處理。另外mysql樂觀鎖的處理,只適用於更新,對這種插入的操作沒用。

特別說明:在mysql中unique 索引將會對null欄位失效,也就是說(a欄位上建立唯一索引):

insert into test(a) values(null)

insert into test(a) values(null)

是可以重複插入的(聯合唯一索引也一樣)。

MySql避免重複插入記錄 根據主鍵判重

今天用python抓取資料入庫需要避免重複資料插入,在網上找了一些方法 方案一 使用ignore關鍵字 如果是用主鍵primary或者唯一索引unique區分了記錄的唯一性,避免重複插入記錄可以使用 insert ignore into table name email,phone,user id ...

map狀態判重

用兩個佇列模擬就可以了。當遊戲次數太多時可以輸出 1 如果嚴格的來判斷遊戲會不會結束。可以用map儲存兩個人手中的狀態 mapint mapint int m while q1.empty q2.empty else if m q1 q2 1 每輪遊戲結束時,判斷新狀態是否已經存在 思考 map對狀...

連通塊判重

統計連通塊種類和數量,數量比較容易使用洪氾即可快速完成,主要是統計種類。因此本文重點放在連通塊判重上。判重一般可以聯想到hash,難點也是hash函式的設計,如何避免衝突。t1 影象儲存 只有上下左右連通,平移重合則相似 hash函式設計 把dfs第幾步走的方向作為hash的引數,直接用string...