表結構:
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...