mysql唯一性約束unique代碼示例
唯一性約束
1. 作用
用來(lái)限制某個(gè)字段/某列的值不能重復(fù)。

2. 關(guān)鍵字
UNIQUE
3. 特點(diǎn)
- 同一個(gè)表可以有多個(gè)唯一約束。
- 唯一約束可以是某一個(gè)列的值唯一,也可以多個(gè)列組合的值唯一。
- 唯一性約束允許列值為空。
- 在創(chuàng)建唯一約束的時(shí)候,如果不給唯一約束命名,就默認(rèn)和列名相同。
- MySQL會(huì)給唯一約束的列上默認(rèn)創(chuàng)建一個(gè)唯一索引。
4. 添加唯一約束
(1)建表時(shí)
在CREATE TABLE時(shí)添加約束 CREATE TABLE test2( id INT UNIQUE, #列級(jí)約束 last_name VARCHAR(15) , email VARCHAR(25), salary DECIMAL(10,2), #表級(jí)約束 CONSTRAINT uk_test2_email UNIQUE(email) );

查看約束
SELECT * FROM information_schema.table_constraints WHERE table_name = ‘test2';
可以看到,沒(méi)有寫(xiě) 約束名 的時(shí)候以定義的列名 id 來(lái)命名

在創(chuàng)建唯一約束的時(shí)候,如果不給唯一約束命名,就默認(rèn)和列名相同。
INSERT INTO test2(id,last_name,email,salary) VALUES(1,‘Tom',‘tom@126.com',4500); #錯(cuò)誤:Duplicate entry ‘1' for key ‘test2.id' INSERT INTO test2(id,last_name,email,salary) VALUES(1,‘Tom1',‘tom1@126.com',4600); #錯(cuò)誤:Duplicate entry ‘tom@126.com' for key ‘test2.uk_test2_email' INSERT INTO test2(id,last_name,email,salary) VALUES(2,‘Tom1',‘tom@126.com',4600);
可以向聲明為
unique的字段上添加null值。而且可以多次添加null
INSERT INTO test2(id,last_name,email,salary) VALUES(2,‘Tom1',NULL,4600);

INSERT INTO test2(id,last_name,email,salary) VALUES(3,'Tom3',NULL,4600);

create table 表名稱(
字段名 數(shù)據(jù)類型,
字段名 數(shù)據(jù)類型 unique,
字段名 數(shù)據(jù)類型 unique key,
字段名 數(shù)據(jù)類型
);
create table 表名稱(
字段名 數(shù)據(jù)類型,
字段名 數(shù)據(jù)類型,
字段名 數(shù)據(jù)類型,
[constraint 約束名] unique key(字段名)
);
舉例:
create table student(
sid int,
sname varchar(20),
tel char(11) unique,
cardid char(18) unique key
);
CREATE TABLE t_course(
cid INT UNIQUE,
cname VARCHAR(100) UNIQUE,
description VARCHAR(200)
);
CREATE TABLE USER(
id INT NOT NULL,
NAME VARCHAR(25),
PASSWORD VARCHAR(16),
-- 使用表級(jí)約束語(yǔ)法
CONSTRAINT uk_name_pwd UNIQUE(NAME,PASSWORD)
);
表示用戶名和密碼組合不能重復(fù)
insert into student values(1,'張三','13710011002','101223199012015623'); insert into student values(2,'李四','13710011003','101223199012015624'); mysql> select * from student; +-----+-------+-------------+--------------------+ | sid | sname | tel | cardid | +-----+-------+-------------+--------------------+ | 1 | 張三 | 13710011002 | 101223199012015623 | | 2 | 李四 | 13710011003 | 101223199012015624 | +-----+-------+-------------+--------------------+ 2 rows in set (0.00 sec) insert into student values(3,'王五','13710011004','101223199012015624'); #身份證號(hào)重復(fù) ERROR 1062 (23000): Duplicate entry '101223199012015624' for key 'cardid' insert into student values(3,'王五','13710011003','101223199012015625'); ERROR 1062 (23000): Duplicate entry '13710011003' for key 'tel'
(2)建表后指定唯一鍵約束
#字段列表中如果是一個(gè)字段,表示該列的值唯一。如果是兩個(gè)或更多個(gè)字段,那么復(fù)合唯一,即多個(gè)字段的組合是唯一的 #方式1: alter table 表名稱 add unique key(字段列表); #方式2: alter table 表名稱 modify 字段名 字段類型 unique;
在ALTER TABLE時(shí)添加約束
UPDATE test2 SET salary = 5000 WHERE id = 3; #方式1: ALTER TABLE test2 ADD CONSTRAINT uk_test2_sal UNIQUE(salary);

#方式2: ALTER TABLE test2 MODIFY last_name VARCHAR(15) UNIQUE;

#字段列表中如果是一個(gè)字段,表示該列的值唯一。如果是兩個(gè)或更多個(gè)字段,那么復(fù)合唯一,即多個(gè)字段的組合是唯一的 #方式1: alter table 表名稱 add unique key(字段列表);
5. 關(guān)于復(fù)合唯一約束
create table 表名稱(
字段名 數(shù)據(jù)類型,
字段名 數(shù)據(jù)類型,
字段名 數(shù)據(jù)類型,
unique key(字段列表) #字段列表中寫(xiě)的是多個(gè)字段名,多個(gè)字段名用逗號(hào)分隔,表示那么是復(fù)合唯一,即多個(gè)字段的組合是唯一的
);
#學(xué)生表
create table student(
sid int, #學(xué)號(hào)
sname varchar(20), #姓名
tel char(11) unique key, #電話
cardid char(18) unique key #身份證號(hào)
);
#課程表
create table course(
cid int, #課程編號(hào)
cname varchar(20) #課程名稱
);
#選課表
create table student_course(
id int,
sid int,
cid int,
score int,
unique key(sid,cid) #復(fù)合唯一
);
insert into student values(1,'張三','13710011002','101223199012015623');#成功
insert into student values(2,'李四','13710011003','101223199012015624');#成功
insert into course values(1001,'Java'),(1002,'MySQL');#成功
mysql> select * from student;
+-----+-------+-------------+--------------------+
| sid | sname | tel | cardid |
+-----+-------+-------------+--------------------+
| 1 | 張三 | 13710011002 | 101223199012015623 |
| 2 | 李四 | 13710011003 | 101223199012015624 |
+-----+-------+-------------+--------------------+
2 rows in set (0.00 sec)
mysql> select * from course;
+------+-------+
| cid | cname |
+------+-------+
| 1001 | Java |
| 1002 | MySQL |
+------+-------+
2 rows in set (0.00 sec)
insert into student_course values
(1, 1, 1001, 89),
(2, 1, 1002, 90),
(3, 2, 1001, 88),
(4, 2, 1002, 56);#成功
mysql> select * from student_course;
+----+------+------+-------+
| id | sid | cid | score |
+----+------+------+-------+
| 1 | 1 | 1001 | 89 |
| 2 | 1 | 1002 | 90 |
| 3 | 2 | 1001 | 88 |
| 4 | 2 | 1002 | 56 |
+----+------+------+-------+
4 rows in set (0.00 sec)
insert into student_course values (5, 1, 1001, 88);#失敗
#ERROR 1062 (23000): Duplicate entry '1-1001' for key 'sid' 違反sid-cid的復(fù)合唯一
刪除唯一約束
添加唯一性約束的列上也會(huì)自動(dòng)創(chuàng)建唯一索引。
刪除唯一約束只能通過(guò)刪除唯一索引的方式刪除。
刪除時(shí)需要指定唯一索引名,唯一索引名就和唯一約束名一樣。
如果創(chuàng)建唯一約束時(shí)未指定名稱,如果是單列,就默認(rèn)和列名相同;如果是組合列,那么默認(rèn)和()中排在第一個(gè)的列名相同。也可以自定義唯一性約束名。
SELECT * FROM information_schema.table_constraints WHERE table_name = ‘表名'; #查看都有哪些約束 ALTER TABLE USER DROP INDEX uk_name_pwd;
注意:可以通過(guò)
show index from 表名稱;查看表的索引
總結(jié)
到此這篇關(guān)于mysql唯一性約束unique的文章就介紹到這了,更多相關(guān)mysql唯一性約束unique內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ubuntu下磁盤(pán)空間不足導(dǎo)致mysql無(wú)法啟動(dòng)的解決方法
昨天又遇到了MySQL數(shù)據(jù)庫(kù)無(wú)法重啟的問(wèn)題,還以為是權(quán)限的原因,后來(lái)發(fā)現(xiàn)提示是因?yàn)榇疟P(pán)空間不足導(dǎo)致的,通過(guò)查找相關(guān)資料得以解決了,所以下面這篇文章主要介紹了ubuntu下磁盤(pán)空間不足導(dǎo)致mysql無(wú)法啟動(dòng)的解決方法,需要的朋友可以參考下。2017-03-03
MySql批量插入優(yōu)化Sql執(zhí)行效率實(shí)例詳解
這篇文章主要介紹了MySql批量插入優(yōu)化Sql執(zhí)行效率實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
MySql數(shù)據(jù)庫(kù)時(shí)間序列間隔查詢方式
這篇文章主要介紹了MySql數(shù)據(jù)庫(kù)時(shí)間序列間隔查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
MySQL?SELECT數(shù)據(jù)查看WHERE(AND?OR?IN?NOT)語(yǔ)句
這篇文章主要介紹了MySQL?SELECT數(shù)據(jù)查看WHERE(AND?OR?IN?NOT)de?語(yǔ)句學(xué)習(xí),非常適合新手小白朋友,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
MySQL快速插入大量數(shù)據(jù)的解決方案和代碼示例
在這篇博客中,我們將深入探討如何高效插入大量數(shù)據(jù)到MySQL數(shù)據(jù)庫(kù),無(wú)論你是數(shù)據(jù)庫(kù)新手還是經(jīng)驗(yàn)豐富的開(kāi)發(fā)者,這篇文章都將為你提供實(shí)用的解決方案和代碼示例,幫助你解決插入3萬(wàn)條數(shù)據(jù)需要20多秒的問(wèn)題,需要的朋友可以參考下2024-08-08
MySQL中的事件調(diào)度基礎(chǔ)學(xué)習(xí)教程
這篇文章主要介紹了MySQL中的事件調(diào)度基礎(chǔ)學(xué)習(xí)教程,本文介紹了對(duì)Event Scheduler的一些基本操作方法,需要的朋友可以參考下2015-11-11
MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理詳解
本文以MySQL數(shù)據(jù)庫(kù)為研究對(duì)象,討論與數(shù)據(jù)庫(kù)索引相關(guān)的一些話題。特別需要說(shuō)明的是,MySQL支持諸多存儲(chǔ)引擎,而各種存儲(chǔ)引擎對(duì)索引的支持也各不相同,因此MySQL數(shù)據(jù)庫(kù)支持多種索引類型,如BTree索引,哈希索引,全文索引等等2016-12-12

