日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql数据唯一约束与唯一索引案例总结及踩坑记(含NULL值与唯一约束唯一索引的搭配使用)

發布時間:2024/9/27 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql数据唯一约束与唯一索引案例总结及踩坑记(含NULL值与唯一约束唯一索引的搭配使用) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Mysql數據唯一索引與唯一約束案例總結

唯一約束的說明

唯一約束是約束(CONSTRAINT)里的一種,常見的還有主鍵、外檢、默認值、是否為空、檢查等。唯一約束即限制某個或某些字段具有唯一性(不能重復)。

唯一索引的說明

唯一索引是只允許索引中的每個值對應記錄的一行,這就像身份標識一樣,每個人都只有一個。

代碼驗證

創建表時指定唯一約束

CREATE TABLE tb_unique (id int, name varchar(20) UNIQUE, addr varchar(30), age int )

:1 當某個字段被指定為UNIQUE時會自動產生唯一索引。
? ? ? ?2 在某個字段定義為唯一時還可以通過修改表時對該字段再次定義為UNIQUE,不過這顯然沒太大意義。再SHOW INDEX FROM tablename時可查看到多個關于該字段UNIQUE的重復定義。

創建表時指定復合多字段唯一約束

CREATE TABLE tb_unique2 (id int, name varchar(20), addr varchar(30), age int, PRIMARY key(id), UNIQUE KEY com_nameadrr (name,addr), KEY age (age) )

:1 這里的KEY age(age)意為普通索引。可通過查看索引命令SHOW INDEX FROM tablename命令查看,詳細的見查看索引部分。

通過數據字典查看表的約束

select * FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_NAME='tb_unique' AND CONSTRAINT_TYPE='UNIQUE'/* 結果 CONSTRAINT_CATALOG???? CONSTRAINT_SCHEMA?????? CONSTRAINT_NAME??? TABLE_SCHEMA??? TABLE_NAME?????? CONSTRAINT_TYPE def? shenl????? name????? shenl????? tb_unique????? UNIQUE*/

通過修改表創建唯一約束

ALTER TABLE tb_unique ADD CONSTRAINT cons_uniquename UNIQUE(addr); select * FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_NAME='tb_unique' AND CONSTRAINT_TYPE='UNIQUE'/* 結果 CONSTRAINT_CATALOG???? CONSTRAINT_SCHEMA?????? CONSTRAINT_NAME??? TABLE_SCHEMA??? TABLE_NAME?????? CONSTRAINT_TYPE def? shenl????? name????? shenl????? tb_unique????? UNIQUE def? shenl????? cons_uniqueaddr? shenl????? tb_unique????? UNIQUE */

創建表時指定唯一索引

CREATE TABLE tb_uniqueidx (id int, name varchar(20) UNIQUE, addr varchar(30), age int, UNIQUE INDEX idx_name(name(20) ASC) )-- 通過show create table查看表創建腳本。 show create table tb_uniqueidx; /* 結果 Table???? Create Table tb_uniqueidx CREATE TABLE `tb_uniqueidx` (`id` int(11) DEFAULT NULL,`name` varchar(20) DEFAULT NULL,`addr` varchar(30) DEFAULT NULL,`age` int(11) DEFAULT NULL,UNIQUE KEY `name` (`name`),UNIQUE KEY `idx_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 */-- 約束里查看查看Unique和索引信息。 select * FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_NAME='tb_uniqueidx' AND CONSTRAINT_TYPE='UNIQUE' /*結果 CONSTRAINT_CATALOG?? CONSTRAINT_SCHEMA??? CONSTRAINT_NAME TABLE_SCHEMA? TABLE_NAME?????? CONSTRAINT_TYPE def? shenl????? name???? shenl????? tb_uniqueidx UNIQUE def? shenl????? idx_name????? shenl????? tb_uniqueidx UNIQUE */

修改表時指定唯一索引

CREATE UNIQUE INDEX idx_addr ON tb_uniqueidx (addr (30) DESC); ALTER TABLE tb_uniqueidx ADD UNIQUE INDEX idx_addr2 (addr (30) DESC); -- 通過key關鍵字和index效果一樣。 ALTER TABLE tb_uniqueidx ADD UNIQUE KEY idx_addr2 (addr (30) DESC);

查看索引信息

show index from tb_unique2/* 部分結果 tb_unique2??? 0???? PRIMARY?????? 1???? id tb_unique2??? 0???? com_nameadrr???? 1???? name tb_unique2??? 0???? com_nameadrr???? 2???? addr tb_unique2??? 1???? age? 1???? age */

刪除索引

DROP INDEX idx_addr ON tb_uniqueidx alter table tb_uniqueidx drop index idx_addr2;

唯一索引與NULL

CREATE TABLE tb_uniqueidx (id int, name varchar(20) UNIQUE, addr varchar(30), age int, PRIMARY KEY(id), UNIQUE INDEX idx_name(addr(30) ASC) )-- 插入多條為NULL的值到建立唯一索引的字段里 INSERT INTO tb_uniqueidx VALUES(1,'Tom','Shanghai',30); INSERT INTO tb_uniqueidx VALUES(2,'Tim',NULL,40); INSERT INTO tb_uniqueidx VALUES(3,'John',NULL,40);

由此可見唯一索引對NULL值是免疫的,即并不能約束它(NULL)。

觸發器約束唯一索引里的NULL

-- 通過約束只能輸入一次NULL值,觸發器需要在表沒有數據時即創建。 CREATE TRIGGER trg_tb_uniqueidx BEFORE INSERT ON tb_uniqueidx FOR EACH ROW BEGIN DECLARE v_errmsg, v_value text; IF EXISTS(SELECT 1 FROM tb_uniqueidx WHERE addr <=> NEW.addr) THEN IF NEW.addr IS NULL THEN SET v_value = 'NULL'; ELSE SET v_value = CONCAT('''', NEW.addr, ''''); END IF; SET v_errmsg = CONCAT('重復的值 ',v_value,' 出現在字段 addr 里'); SIGNAL SQLSTATE '23000' SET MESSAGE_TEXT = v_errmsg, MYSQL_ERRNO = 1062; END IF; END-- 當我們再次插入NULL值時則會報錯。 INSERT INTO tb_uniqueidx VALUES(4,'Kate',NULL,50);

NOT NULL結合UNIQUE一起使用

該方法即將NOT NULL和UNIQUE約束一起使用。

CREATE TABLE tb_uniqueidx (id int, name varchar(20) UNIQUE, addr varchar(30) NOT NULL UNIQUE, age int, PRIMARY KEY(id), UNIQUE INDEX idx_name(addr(30) ASC) )

總結

以上是生活随笔為你收集整理的Mysql数据唯一约束与唯一索引案例总结及踩坑记(含NULL值与唯一约束唯一索引的搭配使用)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。