約束
- 基本概念
- 非空約束 not null
- 唯一性約束
- 列級唯一性約束
- 表級唯一性約束
- 主鍵約束
- 單一主鍵
- 復合主鍵
- 使用表級約束方式定義主鍵
- 主鍵值自增
- 外鍵約束
- 基本語法:
- 關于外鍵約束的相關術語
- 案例引入
- 順序要求:
- 注意點
基本概念
- 什么是約束?
在創建表的時候,可以給表的欄位添加相應的約束,添加約束的目的是為了保證表中資料的
合法性、有效性、完整性, - 常見的約束有哪些呢?
非空約束(not null):約束的欄位不能為NULL
唯一約束(unique):約束的欄位不能重復
主鍵約束(primary key):約束的欄位既不能為NULL,也不能重復(簡稱PK)
外鍵約束(foreign key):(簡稱FK)
檢查約束(check):注意Oracle資料庫有check約束,但是mysql沒有,目前mysql不支持該約束,
非空約束 not null
例:創建一個t_user表,其中username不允許為空,
create table t_user(
id int,
username varchar(255) not null,
password varchar(255)
);
此時執行資料插入時若password對應項為空則報錯:
insert into t_user(id,password) values(1,'123');
ERROR 1364 (HY000): Field 'username' doesn't have a default valueERROR 1364 (HY000): Field 'username' doesn't have a default value
唯一性約束
唯一約束修飾的欄位具有唯一性,不能重復,但可以為NULL,
列級唯一性約束
create table t_user(id int,username varchar(255) unique);
其中username被添加了唯一約束,此時若重復插入username一樣的資料會報錯:
insert into t_user(id,username) values(1,'zhangsan');
insert into t_user(id,username) values(2,'zhangsan');
ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 't_user.username'
表級唯一性約束
create table t_user(
id int,
usercode varchar(255),
username varchar(255),
unique(usercode,username)
);
此時多個欄位聯合起來添加1個約束unique,
我們可以向表內添加任何(username,usercode)不重復的資料,如:
insert into t_user values(1,'111','zs');
insert into t_user values(2,'111','ls');
insert into t_user values(3,'222','zs');
結果是添加成功:
+------+----------+----------+
| id | username | usercode |
+------+----------+----------+
| 1 | 111 | zs |
| 2 | 111 | ls |
| 3 | 222 | zs |
+------+----------+----------+
但是當我們添加(username,usercode)相同的資料時就會報錯:
insert into t_user values(4,'111','zs');
ERROR 1062 (23000): Duplicate entry '111-zs' for key 'usercode'
如果想要username和usercode分別是唯一的,則需分別添加唯一性約束,
create table t_user(
id int,
usercode varchar(255) unique,
username varchar(255) unique
);
表級唯一性約束也可以只對單一欄位進行約束,效果和列級約束一樣
主鍵約束
-
主鍵分為單一主鍵和復合(聯合)主鍵,單一主鍵是由一個欄位構成的,復合(聯合)主鍵是由多個欄位構成的,
-
主鍵有什么作用?
- 表的設計三范式中有要求,第一范式就要求任何一張表都應該有主鍵,
- 主鍵的作用:主鍵值是這行記錄在這張表當中的唯一標識,(就像一個人的身份證號碼一樣,)
-
主鍵的特點:不能為NULL,也不能重復,
-
一張表的主鍵約束只能有1個,
-
主鍵相關的術語?
主鍵約束 : primary key
主鍵欄位 : id欄位添加primary key之后,id叫做主鍵欄位
主鍵值 : id欄位中的每一個值都是主鍵值, -
主鍵的分類?
根據主鍵欄位的欄位數量來劃分:- 單一主鍵(推薦的,常用的,)
- 復合主鍵(多個欄位聯合起來添加一個主鍵約束)(復合主鍵不建議使用,因為復合主鍵違背三范式,)
根據主鍵性質來劃分:
- 自然主鍵:主鍵值最好就是一個和業務沒有任何關系的自然數,(這種方式是推薦的)
- 業務主鍵:主鍵值和系統的業務掛鉤,例如:拿著銀行卡的卡號做主鍵,拿著身份證號碼作為主鍵,(不推薦用)
最好不要拿著和業務掛鉤的欄位作為主鍵,因為以后的業務一旦發生改變的時候,主鍵值可能也需要隨著發生變化,但有的時候沒有辦法變化,因為變化可能會導致主鍵值重復,
單一主鍵
create table t_user(
id int primary key, // 列級約束
username varchar(255),
email varchar(255)
);
insert into t_user(id,username,email) values(1,'zs','zs@123.com');
insert into t_user(id,username,email) values(2,'ls','ls@123.com');
insert into t_user(id,username,email) values(3,'ww','ww@123.com');
select * from t_user;
+----+----------+------------+
| id | username | email |
+----+----------+------------+
| 1 | zs | zs@123.com |
| 2 | ls | ls@123.com |
| 3 | ww | ww@123.com |
+----+----------+------------+
在添加了主鍵的表中不能添加重復的資料:
insert into t_user(id,username,email) values(1,'jack','jack@123.com');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
也不能不添加資料,即不能為空
insert into t_user(username,email) values('jack','jack@123.com');
ERROR 1364 (HY000): Field 'id' doesn't have a default value
復合主鍵
create table t_user(
id int,
username varchar(255),
password varchar(255),
primary key(id,username)
);
使用表級約束方式定義主鍵
create table t_user(
id int,
username varchar(255),
primary key(id)
);
主鍵值自增
create table t_user(
id int primary key auto_increment,
username varchar(255)
);
id欄位自動維護一個自增的數字,從1開始,以1遞增,
insert into t_user(username) values('a');
insert into t_user(username) values('b');
insert into t_user(username) values('c');
insert into t_user(username) values('d');
insert into t_user(username) values('e');
insert into t_user(username) values('f');
select * from t_user;
+----+----------+
| id | username |
+----+----------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | e |
| 6 | f |
+----+----------+
外鍵約束
基本語法:
foreign key(子表欄位名) references 父表名(父表被參考欄位名)
關于外鍵約束的相關術語
- 外鍵約束: foreign key
- 外鍵欄位:添加有外鍵約束的欄位
- 外鍵值:外鍵欄位中的每一個值,
案例引入
請設計資料庫表,用來維護學生和班級的資訊?
- 方法1:一張表存盤所有資料
no(pk) name classno classname
-------------------------------------------------------
1 zs1 101 高三1班
2 zs2 101 高三1班
3 zs3 102 高三2班
4 zs4 102 高三2班
5 zs5 102 高三2班
- 方法2:兩張表(班級表和學生表)
t_class 班級表
cno(pk) cname
-----------------------
101 高三1班
102 高三2班
t_student 學生表
sno(pk) sname classno(該欄位添加外鍵約束fk)
--------------------------------------------------
1 zs1 101
2 zs2 101
3 zs3 102
4 zs4 102
5 zs5 102
t_student中的classno欄位參考t_class表中的cno欄位,此時t_student表叫做子表,t_class表叫做父表,
順序要求:
- 洗掉資料的時候,先洗掉子表,再洗掉父表,
- 添加資料的時候,先添加父表,在添加子表,
- 創建表的時候,先創建父表,再創建子表,
- 洗掉表的時候,先洗掉子表,在洗掉父表,
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
cno int,
cname varchar(255),
primary key(cno)
);
create table t_student(
sno int,
sname varchar(255),
classno int,
primary key(sno),
foreign key(classno) references t_class(cno)
);
注意點
- 外鍵可以為NULL,
- 被參考的欄位不一定是主鍵,但至少具有unique約束,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/257521.html
標籤:其他
上一篇:略談事務ACID
下一篇:SQL練習32:將employees表的所有員工的last_name和first_name拼接起來作為Name,中間以一個空格區分
