目錄
前言
一、主鍵約束
1.設(shè)置字段的主鍵約束(PRIMARY KEY,PK)
1.單字段主鍵
2.多字段主鍵
二、設(shè)置表字段的外鍵約束
1.簡介
2.語句格式
三、設(shè)置表字段的非空約束(NOT NULL, NK)
1.簡介
2.語句格式
四、設(shè)置字段值自動增加(AUTO_INCREMENT)
?1.語句格式
? 2.實際應(yīng)用
五、設(shè)置表字段的默認(rèn)值(DEFAULT)
六、調(diào)整列的完整性約束
1.?主鍵PK、外鍵FK和 唯一鍵UK
(1).新增
alter table [table_name] add constraint [constraint_name] [unique key| primary key|foreign key] ([column_name])
(2).刪除
(3).修改
(4).修改默認(rèn)值DEFAULT、自增長和非空NK
???大家好,我是會飛的魚-blog,今天我來給大家介紹一下Mysql,有不足之處,請大家多多指教。感謝大家支持?。。?/strong>
?
前言
????????完整性約束條件是對字段進(jìn)行限制,要求用戶對該屬性進(jìn)行的操作符合特定的要求。如果不滿足完整性約束條件,數(shù)據(jù)庫系統(tǒng)將不再執(zhí)行用戶的操作。MySQL中基本的完整性約束條件如表3-11所示。下表是完整性約束條件:
一、主鍵約束
1.設(shè)置字段的主鍵約束(PRIMARY KEY,PK)
????????主鍵是表的一個特殊字段,能唯一標(biāo)識該表中的每條信息。主鍵和記錄的關(guān)系,如同身份證和人的關(guān)系。主鍵用來標(biāo)識每個記錄,每個記錄的主鍵值都不同。身份證用來表明人的身份,每個人都具有唯一的身份證號。設(shè)置表的主鍵是指在創(chuàng)建表時設(shè)置表的某個字段為該表的主鍵。
????????主鍵的主要目的是幫助數(shù)據(jù)庫管理系統(tǒng)以最快的速度查找到表的某一條信息。主鍵必須滿足的條件就是主鍵必須是唯一的,表中任意兩條記錄的主鍵字段的值不能相同,并且是非空值。主鍵可以是單一的字段,也可以是多個字段的組合。
1.單字段主鍵
????????單字段主鍵的語法規(guī)則如下:
CREATE TABLE tablename(
??? propName propType PRIMARY KEY, ......
);
或
CREATE TABLE tablename(
??? propName propType , ......
PRIMARY KEY(propType)
);
????????創(chuàng)建表school,設(shè)置id字段為PK約束,再查看class表信息,SQL語句如下
mysql> create database school;?? #創(chuàng)建數(shù)據(jù)庫school mysql> use school;?? #選擇數(shù)據(jù)庫school mysql> create table class(id int PRIMARY KEY, name varchar(128), teacher varchar(64));???????? #創(chuàng)建表class mysql> desc class ;? #查詢表class 的定義, describe class 效果等同 mysql> show create table class ;? #同樣可以實現(xiàn)查詢表class 的定義 mysql> insert into class VALUES(1,'一班','martin');? #插入成功 mysql> insert into class VALUES(1,'二班','rock');??? #因主鍵約束,插入失敗 |
Mysql 支持給主鍵設(shè)置名字:
CREATE TABLE tablename(
??? propName propType , ......
CONSTRAINT pk_name PRIMARY KEY(propType)
);
給id字段的PK約束設(shè)置一個名字,可以執(zhí)行SQL語句CONSTRAINT。創(chuàng)建表class:
mysql> create database school;?? #創(chuàng)建數(shù)據(jù)庫school mysql> use school;?? #選擇數(shù)據(jù)庫school mysql> create table class(id int , name varchar(128), teacher varchar(64), CONSTRAINT id_pk PRIMARY KEY (id));???????? #創(chuàng)建表class mysql> desc class ;? #查詢表class 的定義, describe class 效果等同 mysql> show create table class ;? #同樣可以實現(xiàn)查詢表class 的定義 mysql> insert into class VALUES(1,'一班','martin');? #插入成功 mysql> insert into class VALUES(1,'二班','rock');?? ?#因主鍵約束,插入失敗 |
2.多字段主鍵
主鍵是由多個屬性組合而成時,在屬性定義完之后統(tǒng)一設(shè)置主鍵。語法規(guī)則如下:
CREATE TABLE tablename(?
??? propName1 propType ,
??? propName2 propType ,
??? ......????????????????????
[CONSTRAINT pk_name]PRIMARY KEY(propName1, propName2)
);
多字段主鍵的設(shè)置。
mysql> create database school;?? #創(chuàng)建數(shù)據(jù)庫school mysql> use school;?? #選擇數(shù)據(jù)庫school mysql> create table class3(id int, name varchar(128), teacher varchar(64), CONSTRAINT id_pk PRIMARY KEY(id,name));???????? #創(chuàng)建表class3,設(shè)置聯(lián)合主鍵 mysql> desc class3 ;? #查詢表class3 的定義, describe class3 效果等同 mysql> insert into class VALUES(1,'一班','martin');? #插入成功 mysql> insert into class VALUES(1,'一班','rock');??? #因聯(lián)合主鍵約束,插入失敗 |
二、設(shè)置表字段的外鍵約束
1.簡介
????????外鍵是表的一個特殊字段,外鍵約束是為了保證多個表(通常為兩個表)之間的參照完整性,即構(gòu)建兩個表的字段之間的參照關(guān)系。
? ? ? ? 設(shè)置外鍵約束的兩個表之間具有父子關(guān)系,即子表中某個字段的取值范圍由父表決定。例如,表示一個班級和學(xué)生關(guān)系,即每個班級有多個學(xué)生。首先應(yīng)該有兩個表:班級表和學(xué)生表,然后學(xué)生表有一個表示班級編號的字段no,其依賴于班級表的主鍵,這樣字段no就是學(xué)生表的外鍵,通過該字段班級表和學(xué)生表建立了關(guān)系。
- 一個班級表:
ID |
名稱 |
班主任 |
101 |
六年級一班 |
tiger老師 |
102 |
六年級二班 |
王老師 |
班級表主鍵 <ID>
每一行對應(yīng)著一個班級,而一個班級對應(yīng)著多個學(xué)生,所以班級表和學(xué)生表的關(guān)系就是“一對多”:
ID |
姓名 |
班級ID |
性別 |
年齡 |
1 |
小花 |
101 |
M |
9 |
2 |
小紅 |
102 |
F |
8 |
3 |
小軍 |
102 |
M |
8 |
4 |
小白 |
101 |
F |
9 |
班級表<ID> 為學(xué)生表<班級ID >的外鍵
????????在具體設(shè)置FK約束時,設(shè)置FK約束的字段必須依賴于數(shù)據(jù)庫中已經(jīng)存在的父表的主鍵,同時外鍵可以為空(NULL)。
2.語句格式
????????設(shè)置表中某字段的FK約束非常簡單,可以在MySQL數(shù)據(jù)庫管理系統(tǒng)中通過SQL語句FOREIGN KEY來實現(xiàn),其語法形式如下:
CREATE TABLE tablename_1(
propName1 propType ,
propName2 propType ,
......
[CONSTRAINT fk_name] FOREIGN KEY(propName1) REFERENCES table2_name(table2_column)
);
????????其中,tablename_1參數(shù)是要設(shè)置外鍵的表名,propName1參數(shù)是要設(shè)置外鍵的字段,table2_name是父表的名稱,table2_column是父表中設(shè)置主鍵約束的字段名。
mysql> use school; ? #選擇數(shù)據(jù)庫school
mysql> create table class(id int PRIMARY KEY, name varchar(128), teacher varchar(64)); ? ? ? ? #創(chuàng)建表class
mysql> desc class ; ?#查詢表class 的定義, describe class 效果等同
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) ); ?#創(chuàng)建表student, class_id 為表class id 字段的外鍵
mysql> insert into student(name, class_id, sex) values('小紅', 2, 'M'); ? #插入記錄,主鍵自增長
mysql> insert into student(name, sex) values('小軍', 'M'); ? #插入記錄,允許外鍵為空
三、設(shè)置表字段的非空約束(NOT NULL, NK)
1.簡介
????????當(dāng)數(shù)據(jù)庫表中的某個字段上的內(nèi)容不希望設(shè)置為NULL時,可以使用NK約束進(jìn)行設(shè)置。NK約束在創(chuàng)建數(shù)據(jù)庫表時為某些字段上加上“NOT NULL”約束條件,保證所有記錄中的該字段都有值。如果在用戶插入的記錄中該字段為空值,那么數(shù)據(jù)庫管理系統(tǒng)會報錯。
2.語句格式
????????設(shè)置表中某字段的NK約束非常簡單,查看幫助文檔可以發(fā)現(xiàn),在MySQL數(shù)據(jù)庫管理系統(tǒng)中是通過SQL語句NOT NULL來實現(xiàn)的,其語法形式如下:
CREATE TABLE tablename(
propName propType NOT NULL , ......
);
如:
mysql> create database school; #創(chuàng)建數(shù)據(jù)庫school
mysql> use school; #選擇數(shù)據(jù)庫school
mysql> create table class(id int, name varchar(128) NOT NULL, teacher varchar(64)); #創(chuàng)建表class
mysql> desc class ; #查詢表class 的定義, describe class 效果等同
mysql> show create table class ; #同樣可以實現(xiàn)查詢表class 的定義
????????檢驗數(shù)據(jù)庫school中的class表中字段classno是否被設(shè)置為NK約束,執(zhí)行SQL語句DESCRIBE,具體如下:
四、設(shè)置字段值自動增加(AUTO_INCREMENT)
????????AUTO_INCREMENT是MySQL唯一擴展的完整性約束,當(dāng)向數(shù)據(jù)庫表中插入新記錄時,字段上的值會自動生成唯一的ID。在具體設(shè)置AUTO_INCREMENT約束時,一個數(shù)據(jù)庫表中只能有一個字段使用該約束,該字段的數(shù)據(jù)類型必須是整數(shù)類型。由于設(shè)置AUTO_INCREMENT約束后的字段會生成唯一的ID,因此該字段也經(jīng)常會同時設(shè)置成PK主鍵。
?1.語句格式
????????設(shè)置表中某字段值的自動增加約束非常簡單,可以在MySQL數(shù)據(jù)庫管理系統(tǒng)中通過SQL語句AUTO_INCREMENT來實現(xiàn),其語法形式如下:
CREATE TABLE tablename(
propName propType AUTO_INCREMENT, ......
);
????????在上述語句中,tablename參數(shù)表示所要設(shè)置非空約束的字段名字,propName參數(shù)為屬性名,propType為屬性類型,propName字段要設(shè)置自動增加約束。默認(rèn)情況下,字段propName的值從1開始增加,每增加一條記錄,記錄中該字段的值就會在前一條記錄(或已存在的最大值(包括曾經(jīng)存在的))的基礎(chǔ)上加1。
?
? 2.實際應(yīng)用
mysql> create database school; #創(chuàng)建數(shù)據(jù)庫school
mysql> use school; #選擇數(shù)據(jù)庫school
mysql> create table class(id int PRIMARY KEY AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #創(chuàng)建表class,設(shè)置字段id為自增長
mysql> show create table class ; #查詢表class 的定義
注意:?mysql8?中,AUTO_INCREMENT 必須設(shè)為鍵(主鍵、外鍵和唯一鍵均可)! 否則會報錯!
五、設(shè)置表字段的默認(rèn)值(DEFAULT)
????????當(dāng)為數(shù)據(jù)庫表中插入一條新記錄時,如果沒有為某個字段賦值,數(shù)據(jù)庫系統(tǒng)就會自動為這個字段插入默認(rèn)值。為了達(dá)到這種效果,可通過SQL語句關(guān)鍵字DEFAULT來設(shè)置。
????????設(shè)置數(shù)據(jù)庫表中某字段的默認(rèn)值非常簡單,可以在MySQL數(shù)據(jù)庫管理系統(tǒng)中通過SQL語句DEFAULT來實現(xiàn),其語法形式如下:
CREATE TABLE tablename(
propName propType DEFAULT defaultvalue, ......
);
六、調(diào)整列的完整性約束
1.?主鍵PK、外鍵FK和 唯一鍵UK
(1).新增
alter table [table_name] add constraint [constraint_name] [unique key| primary key|foreign key] ([column_name])
(2).刪除
?????????通過如下命令查詢鍵值的約束名:
?show?index或keys?from?表名;????
????????執(zhí)行如下命令刪除:
主鍵:alter table?表名 drop primary key;
外鍵或唯一鍵:??alter table?表名 drop index 約束名;
(3).修改
????????按照上述步驟 先執(zhí)行?刪除?然后再?新增?即可!
(4).修改默認(rèn)值DEFAULT、自增長和非空NK
????????使用如下語法重新定義列即可:
alter table?表名 modify 列名 類定義;文章來源:http://www.zghlxwxcb.cn/news/detail-442452.html
mysql> create database school; #創(chuàng)建數(shù)據(jù)庫school
mysql> use school; #選擇數(shù)據(jù)庫school
mysql> create table class(id int PRIMARY KEY AUTO_INCREMENT, name varchar(128) UNIQUE, teacher varchar(64)); #創(chuàng)建表class,設(shè)置字段id為自增長
mysql> alter table class modify teacher varchar(64) DEFAULT ‘Martin’ NOT NULL ; #設(shè)置默認(rèn)值和非空
mysql> alter table class modify teacher varchar(64) ; #取消默認(rèn)值和非空
總結(jié)
???????????以上就是我學(xué)習(xí)的總結(jié),希望大家一起探討、探討,一起加油,邁向更好的明天?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-442452.html
到了這里,關(guān)于Mysql列的完整性約束最詳細(xì)教程之一——詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!