MySQL約束是一系列規則,用來約束(允許/限制)存儲在列中的數據。施加約束的目的是為了保證數據庫的一致性。
MySQL約束是在創建數據表的時候聲明的。
MySQL可以實現的不同級別的約束
- 列級(column level)約束:作用于某一列。
- 表級(table level)約束:作用于整個表。
MySQL約束類型
約束名稱 | 描述 |
---|---|
NOT NULL | 非空 |
UNIQUE | 取值不允許重復 |
PRIMARY KEY | 主鍵(主關鍵字) |
FOREIGN KEY | 外鍵(外關鍵字) |
CHECK | 邏輯表達式約束 |
DEFAULT | 默認值(缺省值) |
MySQL約束的語法
CREATE TABLE [table name](
[column name] data type [column constraint],
…
[table constraint] ([[column name]…])...
);
MySQL約束類型舉例
1. [NOT] NULL約束
CREATE TABLE IF NOT EXISTS newauthor(
aut_id varchar(8) NOT NULL,
aut_name varchar(50) NOT NULL,
country varchar(25) NOT NULL,
home_city varchar(25) NOT NULL
);
2. CHECK約束
-
值約束
CREATE TABLE IF NOT EXISTS newbook_mast (
book_id varchar(15) NOT NULL UNIQUE,
book_name varchar(50) ,
isbn_no varchar(15) NOT NULL UNIQUE ,
cate_id varchar(8) ,
aut_id varchar(8) ,
pub_id varchar(8) ,
dt_of_pub date ,
pub_lang varchar(15) ,
no_page decimal(5,0)
CHECK(no_page>0) , # check constraint
book_price decimal(8,2) ,
PRIMARY KEY (book_id)
);
-
取值集合約束
CREATE TABLE IF NOT EXISTS newauthor(
aut_id varchar(8) NOT NULL ,
aut_name varchar(50) NOT NULL,
country varchar(25) NOT NULL CHECK (country IN ('USA','UK','India')),
home_city varchar(25) NOT NULL,
PRIMARY KEY (aut_id,home_city)
);
-
模糊取值約束
CREATE TABLE IF NOT EXISTS newbook_mast(
book_id varchar(15) NOT NULL UNIQUE,
book_name varchar(50) ,
isbn_no varchar(15) NOT NULL UNIQUE ,
cate_id varchar(8) ,
aut_id varchar(8) ,
pub_id varchar(8) ,
dt_of_pub date CHECK (dt_of_pub LIKE '--/--/----'),
pub_lang varchar(15) ,
no_page decimal(5,0) CHECK(no_page>0) ,
book_price decimal(8,2) ,
PRIMARY KEY (book_id)
);
-
帶邏輯操作的約束
CREATE TABLE IF NOT EXISTS newpublisher(
pub_id varchar(8) ,
pub_name varchar(50),
pub_city varchar(25) ,
country varchar(25) ,
country_office varchar(25) ,
no_of_branch int(3),
estd date
CHECK ((country='India' AND pub_city='Mumbai')
OR (country='India' AND pub_city='New Delhi')) ,
PRIMARY KEY (pub_id)
);
3. UNIQUE約束
-
實現方法1(表的定義最后施加)
CREATE TABLE IF NOT EXISTS
newauthor(aut_id varchar(8) NOT NULL ,
aut_name varchar(50) NOT NULL,
country varchar(25) NOT NULL,
home_city varchar(25) NOT NULL,
UNIQUE (aut_id)
);
-
實現方法2(字段定義的最后施加)
CREATE TABLE IF NOT EXISTS newauthor(
aut_id varchar(8) NOT NULL UNIQUE ,
aut_name varchar(50) NOT NULL,
country varchar(25) NOT NULL,
home_city varchar(25) NOT NULL
);
4. DEFAULT約束
CREATE TABLE IF NOT EXISTS newpublisher(
pub_id varchar(8) NOT NULL UNIQUE DEFAULT '' ,
pub_name varchar(50) NOT NULL DEFAULT '' ,
pub_city varchar(25) NOT NULL DEFAULT '' ,
country varchar(25) NOT NULL DEFAULT 'India',
country_office varchar(25) ,
no_of_branch int(3),
estd date
CHECK ((country='India' AND pub_city='Mumbai')
OR (country='India' AND pub_city='New Delhi')) ,
PRIMARY KEY (pub_id)
);
5. AUTO_INCREMENT約束
CREATE TABLE IF NOT EXISTS newauthor(
id int NOT NULL AUTO_INCREMENT,
aut_id varchar(8),
aut_name varchar(50),
country varchar(25),
home_city varchar(25) NOT NULL,
PRIMARY KEY (id)
);
6. PRIMARY KEY約束
-
單個字段作為主鍵(方法1)
CREATE TABLE IF NOT EXISTS newauthor(
aut_id varchar(8) NOT NULL PRIMARY KEY,
aut_name varchar(50) NOT NULL,
country varchar(25) NOT NULL,
home_city varchar(25) NOT NULL
);
-
單個字段作為主鍵(方法2)
CREATE TABLE IF NOT EXISTS newauthor(
aut_id varchar(8) NOT NULL ,
aut_name varchar(50) NOT NULL,
country varchar(25) NOT NULL,
home_city varchar(25) NOT NULL,
PRIMARY KEY (aut_id)
);
-
多個字段作為主鍵
CREATE TABLE IF NOT EXISTS newauthor(
aut_id varchar(8) NOT NULL ,
aut_name varchar(50) NOT NULL,
country varchar(25) NOT NULL,
home_city varchar(25) NOT NULL,
PRIMARY KEY (aut_id, home_city)
);
7. FOREIGN KEY約束
語法:
FOREIGN KEY [column list] REFERENCES [primary key table] ([column list]);
-
為單個字段創建外鍵
CREATE TABLE IF NOT EXISTS newbook_mast (
book_id varchar(15) NOT NULL PRIMARY KEY,
book_name varchar(50) ,
isbn_no varchar(15) NOT NULL ,
cate_id varchar(8) ,
aut_id varchar(8) ,
pub_id varchar(8) ,
dt_of_pub date ,
pub_lang varchar(15) ,
no_page decimal(5,0) ,
book_price decimal(8,2) ,
FOREIGN KEY (aut_id) REFERENCES newauthor(aut_id)
);
-
為多個字段創建外鍵
CREATE TABLE IF NOT EXISTS newpurchase(
invoice_no varchar(12) NOT NULL UNIQUE PRIMARY KEY,
invoice_dt date ,
ord_no varchar(25) ,
ord_date date ,
receive_dt date ,
book_id varchar(8) ,
book_name varchar(50) ,
pub_lang varchar(8) ,
cate_id varchar(8) ,
receive_qty int(5) ,
purch_price decimal(12,2) ,
total_cost decimal(12,2) ,
INDEX (ord_no,book_id),
FOREIGN KEY(ord_no,book_id) REFERENCES neworder(ord_no,book_id),
INDEX (cate_id),
FOREIGN KEY(cate_id) REFERENCES category(cate_id)
);
-
創建來自不同表的外鍵
CREATE TABLE IF NOT EXISTS newbook_mast (
book_id varchar(15) NOT NULL PRIMARY KEY,
book_name varchar(50) ,
isbn_no varchar(15) NOT NULL ,
cate_id varchar(8),
aut_id varchar(8) ,
pub_id varchar(8) ,
dt_of_pub date ,
pub_lang varchar(15) ,
no_page decimal(5,0) ,
book_price decimal(8,2) ,
INDEX (aut_id),
FOREIGN KEY(aut_id) REFERENCES newauthor(aut_id),
INDEX(pub_id),
FOREIGN KEY(pub_id) REFERENCES newpublisher(pub_id)
);
-
外鍵動作的設置
1. UPDATE CASCADE(級聯更新)和DELETE RESTRICT(限制刪除)
CREATE TABLE IF NOT EXISTS newpurchase(
invoice_no varchar(12) NOT NULL UNIQUE PRIMARY KEY,
invoice_dt date ,
ord_no varchar(25) ,
ord_date date ,
receive_dt date ,
book_id varchar(8) ,
book_name varchar(50) ,
pub_lang varchar(8) ,
cate_id varchar(8) ,
receive_qty int(5) ,
purch_price decimal(12,2) ,
total_cost decimal(12,2) ,
INDEX (ord_no,book_id),
FOREIGN KEY(ord_no,book_id) REFERENCES
neworder(ord_no,book_id)
ON UPDATE CASCADE ON DELETE RESTRICT,
INDEX (cate_id),
FOREIGN KEY(cate_id) REFERENCES category(cate_id)
);
2. UPDATE CASCADE(級聯更新)和DELETE SET NULL(刪除置空)
CREATE TABLE IF NOT EXISTS newpurchase (
invoice_no varchar(12) NOT NULL UNIQUE PRIMARY KEY,
invoice_dt date ,
ord_no varchar(25) ,
ord_date date ,
receive_dt date ,
book_id varchar(8) ,
book_name varchar(50) ,
pub_lang varchar(8) ,
cate_id varchar(8) ,
receive_qty int(5) ,
purch_price decimal(12,2) ,
total_cost decimal(12,2) ,
INDEX (ord_no,book_id),
FOREIGN KEY(ord_no,book_id) REFERENCES neworder
(ord_no,book_id)
ON UPDATE CASCADE ON DELETE SET NULL,
INDEX (cate_id),
FOREIGN KEY(cate_id) REFERENCES category(cate_id)
);
3. UPDATE CASCADE(級聯更新)和DELETE NO ACTION(刪除不操作)
CREATE TABLE IF NOT EXISTS newpurchase (
invoice_no varchar(12) NOT NULL UNIQUE PRIMARY KEY,
invoice_dt date ,
ord_no varchar(25) ,
ord_date date ,
receive_dt date ,
book_id varchar(8) ,
book_name varchar(50) ,
pub_lang varchar(8) ,
cate_id varchar(8) ,
receive_qty int(5) ,
purch_price decimal(12,2) ,
total_cost decimal(12,2) ,
INDEX (ord_no,book_id),
FOREIGN KEY(ord_no,book_id) REFERENCES
neworder(ord_no,book_id)
ON UPDATE CASCADE ON DELETE NO ACTION,
INDEX (cate_id),
FOREIGN KEY(cate_id) REFERENCES category(cate_id)
);
參考: https://www.w3resource.com/mysql/creating-table-advance/constraint.php