Mysql的唯一性索引unique

2021-09-08 14:16:20 字數 4051 閱讀 6464

目錄

參考:唯一性索引表建立:

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) 唯一性約束所在的列允許空值,但是主鍵約束所在的列不允許空值。

(2) 可以把唯一性約束放在乙個或者多個列上,這些列或列的組合必須有唯一的。但是,唯一性約束所在的列並不是表的主鍵列。

(3) 唯一性約束強制在指定的列上建立乙個唯一性索引。在預設情況下,建立唯一性的非聚簇索引,但是,也可以指定所建立的索引是聚簇索引。

(4) 建立主鍵的目的是讓外來鍵來引用.

(5) 乙個表最多只有乙個主鍵,但可以有很多唯一鍵

insert ignore會忽略資料庫中已經存在的資料(根據主鍵或者唯一索引判斷),如果資料庫沒有資料,就插入新的資料,如果有資料的話就跳過這條資料.

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:51
id沒有發生變化,資料只更新,但是auto_increment還是增長1了。

死鎖:

insert ... on duplicate key 在執行時,innodb引擎會先判斷插入的行是否產生重複key錯誤,

如果存在,在對該現有的行加上s(共享鎖)鎖,如果返回該行資料給mysql,然後mysql執行完duplicate後的update操作,

然後對該記錄加上x(排他鎖),最後進行update寫入。

如果有兩個事務併發的執行同樣的語句,

那麼就會產生death lock,如

解決辦法:

1、盡量對存在多個唯一鍵的table使用該語句

2、在有可能有併發事務執行的insert 的內容一樣情況下不使用該語句

mysql中unique與primary約束的區別分析**)

mysql避免插入重覆記錄:唯一性約束

mysql優化–insert on duplicate update死鎖

Oracle唯一性約束和唯一性索引的關係

唯一性約束通過唯一性索引來實現?我覺得這說法不對。對於唯一性約束,索引是必須存在的,唯一性約束本質上是通過索引來保證的,但不一定是唯一性索引。唯一性約束允許有null值,唯一性約束的列可允許有多個null值。唯一性約束通過btree索引實現,而btree索引是不會包含null值,但使用null值過濾...

mysql主鍵,唯一性,索引的重要性

mysql建立 為什麼一定需要索引呢?有部分設計者感覺表資料有沒有主鍵的區別只是為了區分是否唯一,根據mysql資料表的不同資料引擎,其實,還是有區別的,inoodb引擎的表資料,資料結構是使用主鍵為索引的b tree結構組織資料,如果我們建立 時沒有主鍵,mysql會自動使用不可見的並且具有唯一性...

主鍵與唯一性索引

其實指定列的索引就相當於對指定的列進行排序,為什麼要排序呢?因為排序有利於對該列的查詢,可以大大增加查詢效率。那麼可能有人認為應該對所有的列排序,這樣就可以增加整個資料庫的查詢效率?這樣的想法是錯誤的,原因是建立索引也是要消耗系統資源的,給每個表裡的每個列都建立索引那麼將對系統造成極大的負擔,那就更...