Mysql数据唯一约束与唯一索引案例总结及踩坑记(含NULL值与唯一约束唯一索引的搭配使用)
生活随笔
收集整理的這篇文章主要介紹了
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值与唯一约束唯一索引的搭配使用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 99A型主战坦克凭什么称为“陆战之王
- 下一篇: 64式手枪,威力究竟如何?