博客 / 詳情

返回

【趙渝強老師】MySQL的數據約束

在數據庫中,“約束”指的是對錶中數據的一種限制條件,它能夠確保數據庫中數據的準確性和有效性。比如有的數據是必填項,就像身份認證的時候,或者填註冊信息的時候,手機號身份證這種就不能空着,所以就有了非空約束;又有的數據比如用户的身份證號碼不能跟其他人的一樣,所以就需要使用唯一約束等等。在MySQL中主要有6種約束:主鍵約束、外鍵約束、唯一約束、檢查約束、非空約束和默認值約束。

視頻講解如下:
https://www.bilibili.com/video/BV1wAvaB5EpV/?aid=115806528606...

一、 主鍵約束(primary key)

主鍵是表裏面的一個特殊字段,這個字段能夠唯一標識該表中的每條信息。一張表只能定義一個主鍵,如果一個字段被定義成了主鍵,該列的值不允許為NULL,也不允許重複。下面是一個示例。

(1)創建表testprimarykey,併為表設置主鍵約束。

mysql> create table testprimarykey(id int primary key,name varchar(20));

# 提示:主鍵約束也可以在多個列上設定,例如:
mysql> create table testprimarykey(
id int ,name varchar(20),gender varchar(10),
primary key(id, name)
);

# 如果要在已經存在的表上添加主鍵約束,可以使用下面的語句:
mysql> alter table testprimarykey add primary key(id,name);

(2)往testprimarykey表中插入數據。

mysql> insert into testprimarykey values(1,'Tom');
mysql> insert into testprimarykey values(2,'Mary');
mysql> insert into testprimarykey values(1,'Mike');

# 提示:當插入第3條數據時,會出現下面的錯誤。因為主鍵不允許重複。
ERROR 1062 (23000): Duplicate entry '1' for key 'testprimarykey.PRIMARY'

二、 外鍵約束(foreign key)

外鍵通常會和主鍵約束一起使用,用來確保數據的一致性。對於有關聯關係的兩張表,相關聯字段中主鍵所在的表就是主表(父表),外鍵所在的表就是從表(子表),外鍵就是用來建立主表與從表的關聯關係。當子表的某一個字段被定義為外鍵時,該列上的值必須在父表中存在或者為NULL值。下面是一個示例。
(1)創建用於外鍵約束的父表和子表。

mysql> create table testparent(
id int primary key,
name varchar(20)
);

mysql> create table testchild(
id int,
name varchar(20),
classes_id int,
foreign key(classes_id) references testparent(id)
);

# 提示:外鍵也可以使用多個字段組合進行設置,例如:
mysql> create table classes(
id int,
name varchar(20),
number int,
primary key(id,name)
);

mysql> create table student(
id int auto_increment primary key,
name varchar(20),
classes_id int,
classes_name varchar(20),
foreign key(classes_id, classes_name) references classes(id, name) 
);

# 如果要在已存在的表上添加外鍵約束,可以使用下面的語句:
mysql> alter table student add foreign key(classes_id, classes_name) references classes(id, name);

(2)往表testparent和表testchild中插入數據。

mysql> insert into testparent values(1,'Dev');
mysql> insert into testchild values(1,'Tom',1);
mysql> insert into testchild values(2,'Mike',1);

# 提示: 這三條insert語句都將成功插入數據。

(3)往表testchild中插入一條錯誤的數據。

mysql> insert into testchild values(3,'Mary',2);

# 由於在表testparent中不存在“2”號記錄,因此將輸出下面的錯誤信息:
ERROR 1452 (23000):
Cannot add or update a child row: 
a foreign key constraint fails 
(`demo1`.`testchild`, CONSTRAINT `testchild_ibfk_1` 
FOREIGN KEY (`classes_id`) REFERENCES `testparent` (`id`))

三、 唯一約束(unique)

唯一約束就是指所有記錄中字段的值不允許重複。值得注意的時,由於SQL中的NULL值是一個特殊值,因此如果一個字段被定義了唯一約束,該字段的值允許為NULL。下面是一個示例。

(1)創建新的表,並設置用户名、密碼不能重複。

mysql> create table testunique(
id int not null ,
name varchar(20),
password varchar(10),
unique(name,password)
);

# 提示:如果想要在已經存在的表上添加唯一約束,可以使用下面的語句:
mysql> mysql> alter table testunique add unique(name, password);

(2)往表testunique中插入數據。

mysql> insert into testunique values(1,'Tom','123456');
mysql> insert into testunique values(2,'Mary','123456');
mysql> insert into testunique values(3,'Mary','123456');

# 當插入第三條數據的時候,會出現下面的錯誤信息:
ERROR 1062 (23000): 
Duplicate entry 'Mary-123456' for key 'testunique.name'

四、 檢查約束(check)

MySQL提供了檢查約束用來指定某列的可取值的範圍,它通過限制輸入到列中的值來強制域的完整性。下面是一個示例。
(1)創建新表,並添加檢查約束用於檢查薪水的範圍。

mysql> create table testcheck(
  id int primary key,
  name varchar(25),
  salary float,
  check(salary>0 and salary<10000)
);

(2)往表testcheck中插入數據

mysql> insert into testcheck values(1,'Tom',9000);
mysql> insert into testcheck values(2,'Mike',15000);

# 當插入第二條數據的時候,會出現下面的錯誤信息:
ERROR 3819 (HY000): Check constraint 'testcheck_chk_1' is violated.

五、 非空約束(not null)

非空約束用於確保該字段的值不能為空值,非空約束只能出現在表對象的列上。下面是一個示例。
(1)創建新表,並設定name為非空約束,且默認值為“no name”

mysql> create table testnotnull(
  id int not null,
  name varchar(20) not null default 'no name',
  gender char
);

(2)往表testnotnull中插入數據。

mysql> insert into testnotnull values(1,'Tom','F');
mysql> insert into testnotnull(id) values(2);

# 提示:這兩條語句都可以成功執行。
# 儘管在第二條語句中沒有給出name的值,在這種情況下將會採用默認值“no name”。

(3)查詢表testnotnull中的數據。

mysql> select * from testnotnull;

# 輸出的信息如下:
+----+---------+--------+
| id | name    | gender |
+----+---------+--------+
|  1 | Tom     | F      |
|  2 | no name | NULL   |
+----+---------+--------+

六、 默認值約束(default)

MySQL默認值約束用來指定某列的默認值。下面是一個示例。
(1)創建一張新的表test5.

mysql> create table test5(id int,name varchar(32),age int);

(2)在表中增加一個字段

mysql> alter table test5 add gender varchar(10) default 'Female';

# 提示:這裏增加了一個gender字段用於表示性別,默認是“Female”。
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.