本次筆記來學習約束,約束在表中無處不在。html
好比,表中的數據不一樣意爲空或者是表中id爲設爲主鍵,都是約束。post
約束分類:學習
主鍵約束(PRIMARY KEY):主鍵表示表中一個惟一的標識,自己不能爲空。spa
惟一約束(UNIQUE):在一個表中僅僅能贊成創建一個主鍵約束,其餘的列不會與此列產生反覆的值。htm
檢查約束(CHECK):檢查一個列的內容是否合法,如:工資在 1500 – 3000之間。it
非空約束(NOT NULL):內容不能爲空。table
外鍵約束(FOREIGN KEY):兩張表之間的進行約束操做。class
約束也是有名字的。假設不指定約束的名字,系統會本身主動的爲咱們重建約束名。格式類似於sys_cn 。也可以本身創email
建約束的名字,格式通常爲:constraint 表名_列名_約束名 約束。之因此使用 「表名_列名_約束名」這種格式。cli
也是爲了達到一種見名知意的效果。定義的方式:列約束必須跟在列的後面進行定義。表級約束可以不跟在列的後面,進行單獨的定義。
約束的範圍:列級約束和表級約束。列級約束僅僅能做用在一個列上。表級約束可以做用在多個列上,也可以做用在一個列上。
可以建立約束,也可以改動約束。
建立約束在建立表的時候建立。改動約束在表建立完畢以後再進行改動。
主要的語法格式:
列級約束定義:
CREATE TABLE table_name(
列名1 列的數據類型類型 [約束 | constraint 約束名稱 約束],
列名2 列的數據類型類型 [約束 | constraint 約束名稱 約束]
)
表級約束定義:
CREATE TABLE table_name(
列名1 列的數據類型 。
列名2 列的數據類型 ,
constraint 約束名稱 約束(列名)
)
NOT NULL 約束
非空的約束僅僅能定義在列上。使用非空約束,表示一個字段的內容不一樣意爲空,即:插入的數據必須是有內容
的,不一樣意爲null 。
例:建立表emp2 ,表中包括三列。id , name 。 salary 。當中要求id 列不能爲空。
create table emp2(
idnumber(9) constraintemp2_id_nn not null ,
namevarchar2(20) not null ,
salarynumber(10 ,2 )
)
constraintemp2_id_nn 列級約束。意思是爲約束起一個名字。使用constraintkeyword來進行定義。
例:數據測試,嘗試向emp2中加入name爲null的數據
insert into emp2
values(1001 , null , 2000)
ORA-01400: 沒法將 NULL 插入 ("SCOTT"."EMP2"."NAME")
設置非空約束以後。假設插入空值,則出現上述錯誤。已經指名了列名name沒法插入空值。
惟一約束(UNIQUE)
列的值是惟一的,在表中的其餘列中不一樣意有反覆的值。
但是贊成表中出現多個null值。
例:建立表emp3
create table emp3
(
idnumber(8) constraintemp3_id_uk unique ,
namevarchar2(20) constraintemp3_name_nn not null ,
salarynumber(10,2),
emailvarchar2(20),
--表級約束
constraintemp3_email_uk unique(email)
)
運行如下的語句兩次以後:
insert into emp3
values(100 , 'zhangsan1' ,2000, 'zhang@128.com' )
ORA-00001: 違反惟一約束條件 (SCOTT.EMP3_ID_UK),提示違反了惟一的約束。但是假設插入值得集合爲(100 。 'zhang' , 2000 , null)和(1001 ,'san' , 3000 , null)的兩條數據。儘管上面兩個值得集合中email列中都是空值,仍然可以成功插入。設置了惟一約束的列,null不以爲是反覆。
主鍵約束(PRIMARY KEY)
通常使用在表的id上面,自己默認內容不能爲空。
create table emp4
(
idnumber(8) constraintemp4_id_pk primary key ,
namevarchar2(20) constraintemp4_name_nn not null ,
salarynumber(10,2),
emailvarchar2(20),
--表級約束
constraintemp4_email_ukunique(email)
)
insert into emp4values(null , 'zhangsan' ,100 ,'125')
ORA-01400: 沒法將 NULL 插入 ("SCOTT"."EMP4"."ID")
insert into emp4values(1001 , 'zhangsan' ,100 ,'125')
ORA-00001: 違反惟一約束條件 (SCOTT.EMP4_ID_PK)
當表中已經存在id 爲1001 的記錄時。依舊不能插入數據。
設置了主鍵的約束,值不是不一樣意爲空和反覆的。
外鍵約束(FOREIGN KEY)
外鍵約束是針對兩張表的約束。在字表中設置的外鍵,在主表中必須設置成主鍵。
再刪除是,應該先刪除子表的記錄在刪除父表的記錄。
建立外鍵約束語句:
constraint 約束名稱 foreign key (子表列名) references 父表名(父表列名)。子表列名和父表列名應該一樣。
create table emp8
(
idnumber(8) ,
name varchar2(20) constraintemp8_name_nn not null ,
salary number(10,2) check (salary >1500 and salary < 30000),
email varchar2(20),
department_id number(10),
--表級約束
constraintemp8_email_uk unique(email) ,
constraintemp8_id_pk primary key (id),
constraintemp8_dept_id_fk foreignkey (department_id) references
departments(department_id)
)
insert into emp6
values (1001 , 'aa' ,null , 2000 ,2000)
ORA-02291:違反完整約束條件 (SCOTT.EMP6_DEPT_ID_FK) -未找到父項keyword 。
上面deptment_id = 2000 在deptments表中是不存在的,則是出現上述錯誤。
設置了外鍵約束以後,字表中的列受到父表的約束,假設是父表中沒有的值 。那麼數據便不能插入成功。
–ON DELETE CASCADE(級聯刪除): 當父表中的列被刪除時。子表中相相應的列也被刪除–ON DELETE SET NULL(級聯置空): 子表中相應的列置空
Check 約束
使用check約束。檢查一個類中插入的內容是否合法。如工資在1500 - 5000 之間。
create table emp8
(
id number(8) ,
name varchar2(20) constraint emp8_name_nn not null ,
salary number(10,2) check (salary >1500 and salary < 30000),
email varchar2(20),
department_id number(10),
--表級約束
constraint emp8_email_ukunique(email) ,
constraint emp8_id_pkprimarykey (id),
constraint emp8_dept_id_fk foreign key (department_id)
references departments(department_id)
)
SQL> insert into emp8
2 values(1001 , 'zhangsan' , 2000 , 'aa' , 30) ;
1 row inserted
SQL> insert into emp8
2 values(1002 ,'zhang' , 500 , 'bb' , 30);
ORA-02290:違反檢查約束條件 (SCOTT.SYS_C005496),當插入的數據不知足salary的範圍便會出上述錯誤提示。
改動約束
改動約束
加入 not null 約束 要使用 modify
Alter table emp5
Modify(salary number(10) not null )
刪除約束
Alter table emp5
Drop constraint emp5_name_nn(約束名)
加入約束
Alter table emp5
Add constraint emp5_nameul unique(name);
有效化約束和無效化約束。
Alter table emp3
enable constraint emp3——name-uk (約束名)
Alter table emp3
Disable constraint emp3——name-uk (約束名)