目錄
參考:唯一性索引表建立:
drop table if exists `sc`;
create table `sc` (
`id` int(11) not null auto_increment,
`name` varchar(200) character set utf8 default null,
`class` varchar(200) character set utf8 default null,
`score` int(11) default null,
`create_time` datetime not null default current_timestamp comment '建立時間',
`create_user_id` bigint(11) default null comment '建立人id',
`modify_time` timestamp not null default current_timestamp on update current_timestamp comment '最後修改時間',
`modify_user_id` bigint(11) default null comment '最後修改人id',
primary key (`id`),
unique key `name` (`name`)
) engine=innodb default charset=utf8 collate=utf8_bin comment='學生資訊表';
在其中建立了唯一索引name,就是說這個學生表同名的學生只能由一位。命令新增unique:
alter table sc add unique (name);
alter table sc add unique key `name_score` (`name`,`score`);
刪除:
alter table sc drop index `name`;
唯一性索引作用:
先行插入部分資料:
insert into sc (name,class,score) values ('呂布','一年二班',67);
insert into sc (name,class,score) values ('趙雲','一年二班',90);
insert into sc (name,class,score) values ('典韋','一年二班',89);
insert into sc (name,class,score) values ('關羽','一年二班',70);
再次檢視表定義:
show create table sc;
create table `sc` (
`id` int(11) not null auto_increment,
`name` varchar(200) character set utf8 default null,
`class` varchar(200) character set utf8 default null,
`score` int(11) default null,
`create_time` datetime not null default current_timestamp comment '建立時間',
`create_user_id` bigint(11) default null comment '建立人id',
`modify_time` timestamp not null default current_timestamp on update current_timestamp comment '最後修改時間',
`modify_user_id` bigint(11) default null comment '最後修改人id',
primary key (`id`),
unique key `name` (`name`)
) engine=innodb auto_increment=5 default charset=utf8 collate=utf8_bin comment='學生資訊表';
這時的auto_increment=5
再次執行sql:
insert into sc (name,class,score) values ('呂布','二年二班',77)
> 1062 - duplicate entry '呂布' for key 'name'
此時再次檢視表定義,會發現auto_increment=6
unique除了在插入重複資料的時候會報錯,還會使auto_increment自動增長
簡單的講,primary key=unique+not null具體的區別:
(1) 唯一性約束所在的列允許空值,但是主鍵約束所在的列不允許空值。insert ignore會忽略資料庫中已經存在的資料(根據主鍵或者唯一索引判斷),如果資料庫沒有資料,就插入新的資料,如果有資料的話就跳過這條資料.(2) 可以把唯一性約束放在乙個或者多個列上,這些列或列的組合必須有唯一的。但是,唯一性約束所在的列並不是表的主鍵列。
(3) 唯一性約束強制在指定的列上建立乙個唯一性索引。在預設情況下,建立唯一性的非聚簇索引,但是,也可以指定所建立的索引是聚簇索引。
(4) 建立主鍵的目的是讓外來鍵來引用.
(5) 乙個表最多只有乙個主鍵,但可以有很多唯一鍵
insert ignore into sc (name,class,score) values ('呂布','二年二班',77)執行上面的語句,會發現並沒有報錯,但是主鍵還是自動增長了。
replace into sc (name,class,score) values ('呂布','二年二班',77);
此時會發現呂布的班級跟年齡都改變了,但是id也變成最新的了,所以不是更新,是刪除再新增
insert into sc (name,class,score) values ('關羽','二年二班',80) on duplicate key update score=100;
> affected rows: 2
舊資料中關羽是一年二班,70分,現在插入,最後發現只有分數變成了100,班級並沒有改變。
4 關羽 一年二班 100 2018-11-16 15:32:18 2018-11-16 15:51:51id沒有發生變化,資料只更新,但是auto_increment還是增長1了。
死鎖:
insert ... on duplicate key 在執行時,innodb引擎會先判斷插入的行是否產生重複key錯誤,如果存在,在對該現有的行加上s(共享鎖)鎖,如果返回該行資料給mysql,然後mysql執行完duplicate後的update操作,
然後對該記錄加上x(排他鎖),最後進行update寫入。
如果有兩個事務併發的執行同樣的語句,
那麼就會產生death lock,如
解決辦法:
1、盡量對存在多個唯一鍵的table使用該語句mysql中unique與primary約束的區別分析**)2、在有可能有併發事務執行的insert 的內容一樣情況下不使用該語句
mysql避免插入重覆記錄:唯一性約束
mysql優化–insert on duplicate update死鎖
Oracle唯一性約束和唯一性索引的關係
唯一性約束通過唯一性索引來實現?我覺得這說法不對。對於唯一性約束,索引是必須存在的,唯一性約束本質上是通過索引來保證的,但不一定是唯一性索引。唯一性約束允許有null值,唯一性約束的列可允許有多個null值。唯一性約束通過btree索引實現,而btree索引是不會包含null值,但使用null值過濾...
mysql主鍵,唯一性,索引的重要性
mysql建立 為什麼一定需要索引呢?有部分設計者感覺表資料有沒有主鍵的區別只是為了區分是否唯一,根據mysql資料表的不同資料引擎,其實,還是有區別的,inoodb引擎的表資料,資料結構是使用主鍵為索引的b tree結構組織資料,如果我們建立 時沒有主鍵,mysql會自動使用不可見的並且具有唯一性...
主鍵與唯一性索引
其實指定列的索引就相當於對指定的列進行排序,為什麼要排序呢?因為排序有利於對該列的查詢,可以大大增加查詢效率。那麼可能有人認為應該對所有的列排序,這樣就可以增加整個資料庫的查詢效率?這樣的想法是錯誤的,原因是建立索引也是要消耗系統資源的,給每個表裡的每個列都建立索引那麼將對系統造成極大的負擔,那就更...