mysql基礎_約束

2023-07-21 06:00:12

介紹

約束對應的英語單詞: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 email
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'

unique 和not null聯合

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