約束對應的英語單詞:constraint,在建立表的時候,我們可以給表中的欄位加上一些約束,來保證這個表中資料的完整性、有效性。
約束的作用就是為了保證:表中的資料有效。
非空約束:not null
唯一性約束:unique
主鍵約束:primary key (簡稱PK)
外來鍵約束:foreign key(簡稱FK)
檢查約束:check(mysql不支援,oracle支援)
介紹重點的幾個約束
受到非空約束的欄位不能為null.
例如:
drop table if exists user;
create table user(
id int,
name varchar(255) not null
);
insert into user(id,name) values(1,'zhangsan');
insert into user(id,name) values(2,'lisi');
insert into user(id) values(3); //這一行name沒有值,設計表的時候也沒有預設值,會報下面的錯
ERROR 1364 (HY000): Field 'name' doesn't have a default value
唯一性約束unique約束的欄位不能重複,但是可以為NULL。
drop table if exists user;
create table user(
id int,
name varchar(255) unique,// 約束直接新增到列後面的,叫做列級約束
email varchar(255)
);
insert into user(id,name,email) values(1,'zhangsan','[email protected]');
insert into user(id,name,email) values(2,'lisi','[email protected]');
insert into user(id,name,email) values(3,'wangwu','[email protected]');
insert into user(id,name,email) values(4,'wangwu','[email protected]');//插入這行資料時,會報下面的錯誤,因為name欄位已經設定為唯一。
ERROR 1062 (23000): Duplicate entry 'wangwu' for key 'name'
insert into user(id) values(4);
執行上面的指令碼後,表結構如下:
id | name | |
---|---|---|
1 | zhangsan | [email protected] |
2 | lisi | [email protected] |
3 | wangwu | [email protected] |
4 | NULL | NULL |
name欄位雖然被unique約束了,但是可以為NULL。
如果需要兩個或者多個欄位聯合起來具有唯一性,就需要用到表級唯一約束。
例如:
drop table if exists user;
create table user(
id int,
name varchar(255),
email varchar(255),
unique(name,email) // 約束沒有新增在列的後面,這種約束被稱為表級約束。
);
insert into user(id,name,email) values(1,'zhangsan','[email protected]');
insert into user(id,name,email) values(2,'zhangsan','[email protected]');
insert into user(id,name,email) values(3,'zhangsan','[email protected]');
ERROR 1062 (23000): Duplicate entry '[email protected]' for key 'name'
drop table if exists user;
create table user(
id int,
name varchar(255) not null unique
);
表結構如下:
Field | Type | Null | Key | Default | Extra |
---|---|---|---|---|---|
id | int(11) | YES | NULL | ||
name | varchar(255) | NO | PRI | NULL |
在mysql當中,如果一個欄位同時被not null和unique約束的話,該欄位自動變成主鍵欄位(下面就講)。
插入資料時:
insert into user(id,name) values(1,'zhangsan');
insert into user(id,name) values(2,'zhangsan'); //error:name不能重複
insert into user(id) values(2); //error:name不能為NULL
主鍵值是每一行記錄的唯一標識,類似身份證號碼。任何一張表都應該有主鍵,沒有主鍵,表無效
主鍵的特徵:not null + unique(前面提到過)
1.列級約束
drop table if exists user;
// 1個欄位做主鍵,叫做:單一主鍵
create table user(
id int primary key, //列級約束
name varchar(255)
);
insert into user(id,name) values(1,'zhangsan');
insert into user(id,name) values(2,'lisi');
insert into user(id,name) values(2,'wangwu');//error:不能重複
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
insert into user(name) values('zhaoliu');//error:不能為NULL
ERROR 1364 (HY000): Field 'id' doesn't have a default value
2.表級約束
drop table if exists user;
create table user(
id int,
name varchar(255),
primary key(id) // 表級約束
);
insert into user(id,name) values(1,'zhangsan');
insert into user(id,name) values(1,'lisi');//error:不能重複
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
id和name聯合起來做主鍵:複合主鍵
drop table if exists user;
create table user(
id int,
name varchar(255),
email varchar(255),
primary key(id,name)
);
insert into user(id,name,email) values(1,'zhangsan','[email protected]');
insert into user(id,name,email) values(1,'lisi','[email protected]');
insert into user(id,name,email) values(1,'lisi','[email protected]');//error:不能重複
ERROR 1062 (23000): Duplicate entry '1-lisi' for key 'PRIMARY'
在實際開發中不建議使用:複合主鍵。建議使用單一主鍵!因為主鍵值存在的意義就是這行記錄的身份證號,只要意義達到即可,單一主鍵可以做到。複合主鍵比較複雜,不建議使用。
1.不能新增兩個主鍵
一張表中主鍵只能有一個,不能有兩個,不然就會像下面的例子那樣報錯。
drop table if exists user;
create table user(
id int primary key,
name varchar(255) primary key
);
ERROR 1068 (42000): Multiple primary key defined
2.主鍵值建議使用:int,bigint,char等型別。不建議使用:varchar來做主鍵。主鍵值一般都是數位,
一般都是定長的!
3.分類
主鍵除了單一主鍵和複合主鍵之外,還可以分為自然主鍵和業務主鍵。
自然主鍵:主鍵值是一個自然數,和業務沒關係。
業務主鍵:主鍵值和業務緊密關聯,例如拿銀行卡賬號做主鍵值。這就是業務主鍵!
在實際開發中自然主鍵使用比較多,因為主鍵只要做到不重複就行,不需要有意義。業務主鍵不好,因
為主鍵一旦和業務掛鉤,那麼當業務發生變動的時候,可能會影響到主鍵值,所以業務主鍵不建議使
用。儘量使用自然主鍵。
4.主鍵自增(auto_increment)
drop table if exists user;
create table user(
id int primary key auto_increment, //auto_increment表示自增,從1開始,以1遞增
name varchar(255)
);
insert into user(name) values('zhangsan');
insert into user(name) values('zhangsan');
insert into user(name) values('zhangsan');
insert into user(name) values('zhangsan');
insert into user(name) values('zhangsan');
id | name |
---|---|
1 | zhangsan |
2 | zhangsan |
3 | zhangsan |
4 | zhangsan |
5 | zhangsan |
在MySQL中,外來鍵約束用於確保兩個表之間的資料一致性。外來鍵約束是一種限制,它將一個表中的列與另一個表中的列相關聯。具體來說,它要求在一個表中的某個列中的值必須在另一個表的某個列中存在。外來鍵約束可以確保資料的完整性和一致性,防止資料被刪除或修改時發生錯誤。
1.建立主表及從表
CREATE TABLE user (
user_id INT PRIMARY KEY,
user_name VARCHAR(50),
user_email VARCHAR(50)
);
CREATE TABLE room (
room_id INT PRIMARY KEY,
room_date DATE,
user_id INT,
);
2.建立約束
ALTER TABLE room
ADD CONSTRAINT fk_room_user
FOREIGN KEY (user_id) REFERENCES user(user_id);
fk_room_user是外來鍵約束的名稱,FOREIGN KEY子句用於指定要新增外來鍵約束的列,REFERENCES子句用於指定關聯表和列。
插入資料:當向"orders"表中插入資料時,如果在"user_id"列中插入一個不存在於"user"表中的值,則會引發外來鍵約束錯誤。
INSERT INTO room (room_id, room_date, user_id)
VALUES (1, '2023-05-11', 10);
-- Error: Cannot add or update a child row: a foreign key constraint fails
更新資料:當更新"user"表中的"user_id"列中的值時,如果在"room"表中存在與該值匹配的"user_id"值,則會引發外來鍵約束錯誤。
UPDATE user SET user_id = 2 WHERE user_id = 1;
-- Error: Cannot delete or update a parent row: a foreign key constraint fails