一、SQL语法——4-数据库约束
4-數據庫約束
1.概述
(1)約束是在表上強制執行的數據校驗規則,約束主要用于保證數據庫里數據的完整性;此外當表中的數據存在相互依賴性時,可以保護相關的數據不被刪除;
(2)大部分數據庫支持如下五種完整性約束:
1)NOT NULL:非空約束,指定某列不允許為空;
2)UNIQUE:唯一約束,指定某列或者幾列組合不能重復;
3)PRIMARY KEY:主鍵約束,指定該列的值可以唯一的標識該條記錄;
4)FOREIGN KEY:外鍵約束,指定該行記錄從屬于主表中的一條記錄,主要用于保證參照完整性;
5)CHECK:檢查,指定一個布爾表達式,用于指定列的值必須滿足該表達式;
(3)約束是數據庫對象,也被保存在系統表中,也擁有自己的名字;
(4)根據約束對列的限制,約束可分為如下兩類:
1)單列約束:每個約束只約束一列;
2)多列約束:每個約束可以約束多個數據列;
(5)為數據表指定約束的時機:
1)建表時為相應的數據列指定約束;
2)建表后,以修改表結構的方式增加約束。
2.NOT NULL約束
(1)NOT NULL約束主要用于確保指定列不可以為空,NOT NULL只能作為列級約束使用,只能使用列級約束語法定義;
(2)NULL在SQL中的解釋:
1)所有數據類型的值都可以是null;
2)空字符串不是NULL,0也不是NULL;
3)NULL不等于NULL;
(3)示例:
#建表時為指定列指定NOT NULL約束 create table hehe(#建立NOT NULL約束,指定hehe_id不能為NULL;hehe_id int not null,#MySQL的NOT NULL約束不能指定名字hehe_name varchar(255) default 'test' not null,#下面列可以為NULL,默認就是可以為NULLhehe_gender varchar(2) null )#使用alter table在修改表時添加或者刪除NOT NULL約束 #增加NOT NULL約束 alter table hehe modify hehe_gender varchar(2) not null; #取消NOT NULL約束 alter table hehe modify hehe_name varchar(255) null; #取消NOT NULL約束,并指定默認值 alter table hehe modify hehe_name varchar(255) default 'test' not null;?
3.UNIQUE約束
(1)UNIQUE約束用于保證指定列或指定列組合不允許出現重復值;
(2)同個表內可以建立多個UNIQUE,UNIQUE也可以由多個列組合而成。當為某個列添加UNIQUE時,MySQL會為該列相應的創建唯一索引。如果不給UNIQUE起名,該UNIQUE默認與列名相同;
(3)UNIQUE可以使用列級語法建立,也可以使用表級語法建立;如果需要為多列建立UNIQUE,或者為UNIQUE起名,只能使用表級約束語法;
(4)示例:
#建表時創建UNIQUE,使用列級約束語法 create table unique_test(#建立非空約束,表示此列不可為nulltest_id int not null,#使用列級約束語法建立UNIQUEtest_name varchar(255) unique );#為多列組合建立UNIQUE,或者為UNIQUE自定義名稱則需要使用表級約束語法建立UNIQUE#表級約束語法格式:[constraint 約束名] 約束定義 #建表時創建UNIQUE,使用表級約束語法 create table unique_test2(#建立NOT NULL約束test_id int not null,test_name varchar(255),test_pass varchar(255),#使用表級約束語法建立UNIQUEunique (test_name),#使用表級約束語法建立UNIQUE并指定約束名constraint test2_uk unique(test_pass)#分別為test_name和test_pass建立UNIQUE );#使用表級約束語法,建表時為列組合建立UNIQUE create table unique_test3(#NOT NULLtest_id int not null,test_name varchar(255),test_pass varchar(255),#使用表級約束語法為列組合建立UNIQUE:兩列的組合不能出現重復值constraint test3_uk unique(test_name,test_pass) );#在修改表結構時,使用add關鍵字添加UNIQUE #為列組合添加UNIQUE alter table unique_test3 add unique(test_name,test_pass);#在修改表時,使用modify關鍵字為單列添加UNIQUE alter table unique_test3 modify test_name varchar(255) unique;#刪除約束(MySQL) alter table unique_test3 drop index test3_uk;?
4.PRIMARY KEY約束
(1)PRIMARY KEY相當于NOT NULL+UNIQUE;即PRIMARY KEY約束的列既不可以存在null也不能夠出現重復值;如果對多列組合建立PRIMARY KEY,則多列里包含的每一列都不能為null,但只要求這些列組合不重復,建立了PRIMARY KEY的列值(或列的組合值)可以用于唯一的標識一條記錄;
(2)每個表中最多只有一個列(或者一個列組合建立PRIMARY KEY);
(3)建立PRIMARY KEY既可以使用表級約束語法,也可以使用列級約束語法,如果為列組合建立PRIMARY KEY只能使用表級約束語法。使用表級約束語法時,可以為約束起約束名(MySQL中無效,默認名稱為PRIMARY);
(4)當創建PRIMARY KEY時,MySQL在所在列或列組合上建立對應的唯一索引;
(5)示例:
#使用列級約束語法,建表時建立PRIMARY KEY create table primary_test(#建立了PRIMARY KEYtest_id int primary key,test_name varchar(255) );#使用表級約束語法,建表時建立PRIMARY KEY create table primary_test2(test_id int,test_name varchar(255),test_pass varchar(255),#指定約束名稱為test2_pk,對大部分數據庫有效,對MySQL無效#MySQL默認PRIMARY KEY的約束名為PRIMARYconstraint test2_pk primary key(test_id) );#為多列組合建立PRIMARY KEY,只能使用表級約束語法 create table primary_test3(test_name varchar(255),test_pass varchar(255),#使用表級約束語法為多列組合建立PRIMARY KEYprimary key(test_name,test_pass) );#刪除指定表的PRIMARY KEY alter table primary_test3 drop primary key;#使用表級約束語法添加PRIMARY KEY(列組合) alter table primary_test3 add primary key(test_name,test_pass);#使用列級約束語法為單列添加PRIMARY KEY alter table primary_test3 modify test_name varchar(255) primary key;#為主鍵添加自增長策略 create table primary_test4(#添加PRIMARY KEY,生成策略為自增長test_id int auto_increment primary key,test_name varchar(255),test_pass varchar(255) );?
5.FOREIGN KEY約束
(1)FORRIGN KEY主要用于保證一個或兩個數據表之間的參照完整性,FOREGIN KEY是構建于一個表的兩個字段或者兩個表的兩個字段之間的參照關系。FOREIGN KEY確保了兩個字段的參照關系:子表外鍵列的值必須在主表被參照列的值范圍內,或者為空(允許使用NOT NULL來約束FOREIGN KEY列不為空)。
(2)當主表的記錄被從表的記錄參照時,主表記錄不允許被刪除,必須先把從表參照該記錄的所有記錄全部刪除后,才可刪除主表的該記錄。也可以在刪除主表記錄時級聯刪除從表中的所有參照該記錄的從表記錄。
(3)從表參照的必須是主表的PRIMARU KEY列或者UNIQUE列,這樣才能保證從表記錄可以準確定位到被參照的主表記錄。同一個表中可以有多個FOREIGN KEY。
(4)FOREIGN KEY通常用于定義兩個實體間的一對多、一對一的關聯關系。對于一對多通常在多的一段添加FOREIGN KEY;對于一對一可以在任意一個表中添加FOREIGN KEY;對于多對多的關聯關系,需要額外增加一個鏈接表記錄他們的關聯關系。
(5)建立FOREIGN KEY同樣可以使用表級約束語法和列級約束語法。如果僅僅對單獨的列建立FOREIGN KEY使用列級約束語法即可,如果要為多個列組合建立FOREIGN KEY或者為FOREIGN KEY起名,則必須使用表級約束語法。
(6)示例:
#采用列級約束語法建立FOREIGN KEY直接使用references關鍵字,references指定該列參照那個主表,以及參照主表的哪個列 #為保證從表參照的主表存在,通常應該先建立主表 #MySQL中使用列級語法建立FOREIGN KEY不會生效,只有使用表級約束語法建立的FOREIGN KEY才會生效 create table teacher_table(teacher_id int auto_increment,teacher_name varchar(255),primary key(teacher_id) ); create table student_table(#為本表建立PRIMARY KEYstudent_id int auto_increment primary key,student_name varchar(255),#指定java_teacher參照到teacher_table的teacher_id列java_teacher int references teacher_table(teacher_id) );#使用表級約束語法建立FOREIGN KEY create table teacher_table1(teacher_id int auto_crement,teacher_name varchar(255),primary key(teacher_id) ); create table student_table1(#建立PRIMARY KEYstudent_id int auto_increment primary key,student_name varchar(255),#指定java_teacher列參照到teacher_table1表中的teacher_id列java_teacher int,foreign key(java_teacher) references teacher_table1(teacher_id) );#如果使用表級約束語法,則需要使用foreign key來指定本表的外鍵列,并使用references指定參照那個主表,以及餐超到 #主表的哪個數據列。使用表級約束語法可以為外鍵約束指定外鍵名,如果創建外鍵約束時沒有指定約束名,則MySQL會為該 #外鍵約束命名為tableName_ibfk_n,其中tableName是從表的表名,而n是從1開始的整數;#如果顯式指定外鍵約束的名字,需要使用constraint來指定 create table teacher_table2(teacher_id int auto_increment,teacher_name varchar(255),primary key(teacher_id) ); create table student_table2(#為本表建立主鍵約束student_id int auto_increment primary key,student_name varchar(255),java_teacher int,#使用表級約束語法建立foreign key并為其指定名字constraint student_teacher_fk foreign key(java_teacher) references teacher_table2(teacher_id) );#如果需要建立多列組合的foreign key則必須使用表級約束語法 create table teacher_table3(teacher_name varchar(255),teacher_pass varchar(255),#使用teacher_name和teacher_pass建立聯合主鍵primary key(teacher_name,teacher_pass) ); create table student_table3(#為本表建立主鍵約束student_id int auto_increment primary key,student_name varchar(255),java_teacher_name varchar(255),java_teacher_pass varchar(255),#使用表級約束語法為java_teacher_name和java_teacher_pass建立聯合foreign keyconstraint student_table3_ibfk_1 foreign key(java_teacher_name,java_teacher_pass) references teacher_table3(teacher_name,teacher_pass) );#刪除foreign key alter table student_table3 drop foreign key student_table3_ibfk_1;#修改表結構時增加foreign key alter table student_table3 add foreign key(java_teacher_name,java_teacher_pass) references teacher_table3(teacher_name,teacher_pass);#foreign key不僅僅可以參照其他表,也可參照自身,這種參照自身的情況稱為自關聯 create table foreign_test(foreign_id int auto_increment primary key,foreign_name varchar(255),#使用該表的refer_id參照到本表的foreign_idrefer_id int,foreign key(refer_id) references foreign_test(foreign_id) );#如果需要定義刪除主表記錄時,從表記錄也會隨之刪除,需要在建立外鍵約束后添加on delete cascade或者 #添加on delete set null; #on delete cascade:刪除主表記錄時,把參照該主表記錄的從表記錄全部級聯刪除 #on delete set null:刪除主表記錄時,把參照該主表記錄的從表記錄的外鍵設置為nullcreate table teacher_table4(teacher_id int auto_increment,teacher_name varchar(255),primary key(teacher_id) ); create table student_table4(student_id auto_increment primary key,student_name varchar(255),java_teacher int,#使用表級約束語法建立foreign key并定義級聯刪除foreign key(java_teacher) references teacher_table4(teacher_id) on delete cascade#或者#foreign key(java_teacher) references teacher_table4(teacher_id) on delete set null );?
?
?
6.CHECK約束
用于指定一個列的值的取值范圍
示例:
create table teacher_table(teacher_id int auto_increment primary key,teacher_age int,teacher_name varchar(255),teacher_pass varchar(255),check(teacher_age<1000) );?
?
?
轉載于:https://www.cnblogs.com/ljiwej/p/7280147.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的一、SQL语法——4-数据库约束的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [bzoj1036][ZJOI2008]
- 下一篇: matches()方法