列的完整性约束
文章目錄
- 1 設置列的完整性約束
- 1.1 設置表字段的主鍵約束(PRIMARY KEY,PK)
- 1.2 設置表字段的外鍵約束(FOREIGN KEY,FK)
- 1.3 設置表字段的非空約束(NOT NULL, NK)
- 1.4 設置表字段唯一約束(UNIQUE,UK)
- 1.5 設置表字段值自動增加(AUTO_INCREMENT)
- 1.6 設置表字段的默認值(DEFAULT)
- 2 調整列的約束完整性
- 2.1 增加、刪除列
- 2.2 調整主鍵PK、外鍵FK和 唯一鍵UK
- 2.3 修改默認值DEFAULT、自增長和非空NK
1 設置列的完整性約束
完整性約束條件是對字段進行限制,要求用戶對該屬性進行的操作符合特定的要求。如果不滿足完整性約束條件,數據庫系統將不再執行用戶的操作。MySQL中基本的完整性約束條件如下表所示:
1.1 設置表字段的主鍵約束(PRIMARY KEY,PK)
主鍵是表的一個特殊字段,能唯一標識該表中的每條信息。主鍵和記錄的關系,如同身份證和人的關系。主鍵用來標識每個記錄,每個記錄的主鍵值都不同。身份證用來表明人的身份,每個人都具有唯一的身份證號。設置表的主鍵是指在創建表時設置表的某個字段為該表的主鍵。
主鍵的主要目的是幫助數據庫管理系統以最快的速度查找到表的某一條信息。主鍵必須滿足的條件就是主鍵必須是唯一的,表中任意兩條記錄的主鍵字段的值不能相同,并且是非空值(設置為主鍵后,該列就默認為非空了)。主鍵可以是單一的字段,也可以是多個字段的組合。
單字段主鍵:
單字段主鍵的語法規則如下:
CREATE TABLE tablename( propName propType PRIMARY KEY, ...... );
或
CREATE TABLE tablename( propName propType , ...... PRIMARY KEY(propType) );
創建表school,設置id字段為PK約束,再查看class表信息,SQL語句如下:
mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table class(id int PRIMARY KEY, name varchar(128), teacher varchar(64)); #創建表class mysql> desc class ; #查詢表class 的定義, describe class 效果等同 mysql> show create table class ; #同樣可以實現查詢表class 的定義 mysql> insert into class VALUES(1,'一班','martin'); #插入成功 mysql> insert into class VALUES(1,'二班','rock'); #因主鍵約束,插入失敗Mysql 支持給主鍵設置名字:
CREATE TABLE tablename( propName propType , ...... CONSTRAINT pk_name PRIMARY KEY(propType) );
給id字段的PK約束設置一個名字,可以執行SQL語句CONSTRAINT。創建表class:
mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table class(id int , name varchar(128), teacher varchar(64), CONSTRAINT id_pk PRIMARY KEY (id)); #創建表class mysql> desc class ; #查詢表class 的定義, describe class 效果等同 mysql> show create table class ; #同樣可以實現查詢表class 的定義 mysql> insert into class VALUES(1,'一班','martin'); #插入成功 mysql> insert into class VALUES(1,'二班','rock'); #因主鍵約束,插入失敗多字段主鍵:
主鍵是由多個屬性組合而成時,在屬性定義完之后統一設置主鍵。語法規則如下:
CREATE TABLE tablename( propName1 propType , propName2 propType , ...... [CONSTRAINT pk_name]PRIMARY KEY(propName1, propName2) );
多字段主鍵的設置:
mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table class3(id int, name varchar(128), teacher varchar(64), CONSTRAINT id_pk PRIMARY KEY(id,name)); #創建表class3,設置聯合主鍵 mysql> desc class3 ; #查詢表class3 的定義, describe class3 效果等同 mysql> insert into class VALUES(1,'一班','martin'); #插入成功 mysql> insert into class VALUES(1,'一班','rock'); #因聯合主鍵約束,插入失敗1.2 設置表字段的外鍵約束(FOREIGN KEY,FK)
外鍵是表的一個特殊字段,外鍵約束是為了保證多個表(通常為兩個表)之間的參照完整性,即構建兩個表的字段之間的參照關系。
設置外鍵約束的兩個表之間具有父子關系,即子表中某個字段的取值范圍由父表決定。例如,表示一個班級和學生關系,即每個班級有多個學生。首先應該有兩個表:班級表和學生表,然后學生表有一個表示班級編號的字段no,其依賴于班級表的主鍵,這樣字段no就是學生表的外鍵,通過該字段班級表和學生表建立了關系。
在具體設置FK約束時,設置FK約束的字段必須依賴于數據庫中已經存在的父表的主鍵,同時外鍵可以為空(NULL)。
設置表中某字段的FK約束非常簡單,可以在MySQL數據庫管理系統中通過SQL語句FOREIGN KEY來實現,其語法形式如下:
CREATE TABLE tablename_1( propName1 propType , propName2 propType , ...... [CONSTRAINT fk_name]FOREIGN KEY(propName1) REFERENCES table2_name(table2_column) );
其中,tablename_1參數是要設置外鍵的表名,propName1參數是要設置外鍵的字段,tablename_2是父表的名稱,table2_column是父表中設置主鍵約束的字段名(外鍵只能在后面單獨指定)。
mysql> use school; #選擇數據庫school mysql> create table class(id int PRIMARY KEY, name varchar(128), teacher varchar(64)); #創建表class mysql> desc class ; #查詢表class 的定義, describe class 效果等同 mysql> mysql> create table student (id int PRIMARY KEY AUTO_INCREMENT, name varchar(64) NOT NULL, class_id int, sex enum('M','F'), FOREIGN KEY(class_id) REFERENCES class(id) ); #創建表student, class_id 為表class id 字段的外鍵 mysql> insert into student(name, class_id, sex) values('小紅', 2, 'M'); #插入記錄,主鍵自增長 mysql> insert into student(name, sex) values('小軍', 'M'); #插入記錄,允許外鍵為空1.3 設置表字段的非空約束(NOT NULL, NK)
當數據庫表中的某個字段上的內容不希望設置為NULL時,可以使用NK約束進行設置。NK約束在創建數據庫表時為某些字段上加上“NOT NULL”約束條件,保證所有記錄中的該字段都有值。如果在用戶插入的記錄中該字段為空值,那么數據庫管理系統會報錯。
設置表中某字段的NK約束非常簡單,查看幫助文檔可以發現,在MySQL數據庫管理系統中是通過SQL語句NOT NULL來實現的,其語法形式如下:
CREATE TABLE tablename( propName propType NOT NULL , ...... );
如:
mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table class(id int, name varchar(128) NOT NULL, teacher varchar(64)); #創建表class mysql> desc class ; #查詢表class 的定義, describe class 效果等同 mysql> show create table class ; #同樣可以實現查詢表class 的定義1.4 設置表字段唯一約束(UNIQUE,UK)
當數據庫表中某個字段上的內容不允許重復時,可以使用UK約束進行設置。UK約束在創建數據庫時為某些字段加上“UNIQUE”約束條件,保證所有記錄中該字段上的值不重復。如果在用戶插入的記錄中該字段上的值與其他記錄中該字段上的值重復,那么數據庫管理系統會報錯。
設置表中某字段的UK約束非常簡單,可以在MySQL數據庫管理系統中通過SQL語句UNIQUE來實現,其語法形式如下:
CREATE TABLE tablename( propName propType UNIQUE, ...... );
注意: unique 約束允許受約束的字段出現多個空值 NULL, 不算重復。
如:
mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table class(id int, name varchar(128) UNIQUE, teacher varchar(64)); #創建表class mysql> desc class ; #查詢表class 的定義, describe class 效果等同 mysql> show create table class ; #同樣可以實現查詢表class 的定義1.5 設置表字段值自動增加(AUTO_INCREMENT)
AUTO_INCREMENT是MySQL唯一擴展的完整性約束,當向數據庫表中插入新記錄時,字段上的值會自動生成唯一的ID。在具體設置AUTO_INCREMENT約束時,一個數據庫表中只能有一個字段使用該約束,該字段的數據類型必須是整數類型。由于設置AUTO_INCREMENT約束后的字段會生成唯一的ID,因此該字段也經常會同時設置成PK主鍵(在MySQL中必須被設置為主鍵,否則會報錯)。
設置表中某字段值的自動增加約束非常簡單,可以在MySQL數據庫管理系統中通過SQL語句AUTO_INCREMENT來實現,其語法形式如下:
CREATE TABLE tablename( propName propType AUTO_INCREMENT, ...... );
在上述語句中,tablename參數表示所要設置非空約束的字段名字,propName參數為屬性名,propType為屬性類型,propName字段要設置自動增加約束。默認情況下,字段propName的值從1開始增加,每增加一條記錄,記錄中該字段的值就會在前一條記錄(或已存在的最大值(包括曾經存在的))的基礎上加1。
mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table class(id int PRIMARY KEY AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #創建表class,設置字段id為自增長 mysql> show create table class ; #查詢表class 的定義注意: mysql8 中,AUTO_INCREMENT 必須設為鍵(主鍵、外鍵和唯一鍵均可)! 否則會報錯!
1.6 設置表字段的默認值(DEFAULT)
當為數據庫表中插入一條新記錄時,如果沒有為某個字段賦值,數據庫系統就會自動為這個字段插入默認值。為了達到這種效果,可通過SQL語句關鍵字DEFAULT來設置。
設置數據庫表中某字段的默認值非常簡單,可以在MySQL數據庫管理系統中通過SQL語句DEFAULT來實現,其語法形式如下:
CREATE TABLE tablename( propName propType DEFAULT defaultvalue, ...... );
注意: 如果沒有設置,則默認為空。
2 調整列的約束完整性
2.1 增加、刪除列
增加列:
alter table class add score int not null,add teacher varchar(64) not null;
刪除列:
alter table class drop score;
修改列的名稱:
alter table class change number num int;,修改列名稱時之前設置的NOT NULL、Default、Auto_Increment會丟失。
2.2 調整主鍵PK、外鍵FK和 唯一鍵UK
新增: alter table [table_name] add constraint [constraint_name] [unique key| primary key|foreign key] ([column_name])
alter table class add unique key(name); alter table class add constraint teacher_uk unique key(teacher);alter table test_m add foreign key(c) references class(id);刪除:
show index或keys from 表名;
主鍵:alter table 表名 drop primary key;
外鍵或唯一鍵: alter table 表名 drop index 約束名;
修改:
- 按照上述步驟 先執行 刪除 然后再 新增 即可!
2.3 修改默認值DEFAULT、自增長和非空NK
使用如下語法重新定義列即可:
alter table 表名 modify 列名 類定義;
注意:修改后之前設置的NOT NULL、Default、Auto_Increment會丟失。
mysql> create database school; #創建數據庫school mysql> use school; #選擇數據庫school mysql> create table class(id int PRIMARY KEY AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #創建表class,設置字段id為自增長 mysql> alter table class modify teacher varchar(64) DEFAULT ‘Martin’ NOT NULL ; #設置默認值和非空 mysql> alter table class modify teacher varchar(64) ; #取消默認值和非空參考資料:
總結
- 上一篇: 招行visa卡是什么卡 申请visa卡的
- 下一篇: Shell中常用的通配符