約束(11)
約束的分類
在實際中,約束主要分為以下五種約束:
- · 主鍵約束:主鍵表示是一個唯一的標識,本身不能為空
|- 例如:身份證編號是唯一的,不可重復的,不可為空的
- · 唯一約束:在一個表中只允許建立一個主鍵約束,而其他列如果不希望出現重復值的話,則就可以使用唯一約束
- · 檢查約束:檢查一個列的內容是否合法
|- 例如:年齡,只能在 0~150 隨
|- 例如:性別,只能是男、女、中性
- · 非空約束:姓名這樣的字段裏面的內容就不能為空
- · 外鍵約束:在兩張表中進行約束操作
主鍵約束(PRIMARY KEY )
主鍵約束一般都是在 id 上使用,而且本身已經默認了內容不能為空。主鍵約束可以在建立表的時候指定:
範例:建立 person 表,在 pid 上增加主鍵約束
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) PRIMARY KEY , name VARCHAR2(200) , age NUMBER(3) , birthday DATE , sex VARCHAR2(2) DEFAULT ‘男‘ ) ;
範例:插入數據,其中插入的主鍵重復和為空
INSERT INTO person(pid,name,age,birthday,sex) VALUES (‘11111111111111111‘,‘張三‘,30,TO_DATE(‘1976-02-13‘,‘yyyy-mm-dd‘),‘女‘) ; INSERT INTO person(pid,name,age,birthday,sex) VALUES (‘11111111111111111‘,‘李四‘,30,TO_DATE(‘1976-02-13‘,‘yyyy-mm-dd‘),‘男‘) ;
錯誤信息:ORA-00001: 違反唯一約束條件 (SCOTT.SYS_C0011321)
錯誤信息上給出的是一個編號的形式,實際上此編號就表示約束的名稱
通過 CONSTRAINT 指定一個約束的名字
範例:將 Person 中的 pid 指定名稱
DROP TABLEperson ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) , age NUMBER(3) , birthday DATE , sex VARCHAR2(2) DEFAULT ‘男‘ , CONSTRAINT person_pid_pk PRIMARY KEY(pid) ) ;
表創建成功之後,再次加入重復的數據
INSERT INTO person(pid,name,age,birthday,sex) VALUES (‘11111111111111111‘,‘張三‘,30,TO_DATE(‘1976-02-13‘,‘yyyy-mm-dd‘),‘女‘) ; INSERT INTO person(pid,name,age,birthday,sex) VALUES (‘11111111111111111‘,‘李四‘,30,TO_DATE(‘1976-02-13‘,‘yyyy-mm-dd‘),‘男‘) ;
錯誤信息:ORA-00001: 違反唯一約束條件 (SCOTT.PERSON_PID_PK)
PERSON_PID_PK,就表示之前在建立數據庫表的時候指定的約束名稱
非空約束(NOT NULL)
使用非空約束,表示一個字段的內容不允許為空,即:插入數據的時候必須插入內容
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) NOT NULL , age NUMBER(3) NOT NULL , birthday DATE , sex VARCHAR2(2) DEFAULT ‘男‘ , CONSTRAINT person_pid_pk PRIMARY KEY(pid) ) ;
範例:插入空的數據
INSERT INTO person(pid,name,age,birthday,sex) VALUES (‘11111111111111111‘,null,30,TO_DATE(‘1976-02-13‘,‘yyyy-mm-dd‘),‘女‘) ; INSERT INTO person(pid,name,birthday,sex) VALUES (‘22222222222222222‘,‘張三‘,TO_DATE(‘1976-02-13‘,‘yyyy-mm-dd‘),‘女‘) ;
在錯誤提示中,可以發現,已經明確的指明了錯誤所發生的字段名稱
ORA-01400: 無法將 NULL 插入 ("SCOTT"."PERSON"."NAME")
ORA-01400: 無法將 NULL 插入 ("SCOTT"."PERSON"."AGE")
唯一約束(UNIQUE )
表示一個字段中的內容是唯一的,其他列不允許重復,假設:現在姓名不允許出現重名的情況
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) UNIQUE NOT NULL , age NUMBER(3) NOT NULL , birthday DATE , sex VARCHAR2(2) DEFAULT ‘男‘ , CONSTRAINT person_pid_pk PRIMARY KEY(pid) ) ;
範例:向表中插入數據,數據插入兩條
INSERT INTO person(pid,name,age,birthday,sex) VALUES (‘11111111111111111‘,‘張三‘,30,TO_DATE(‘1976-02-13‘,‘yyyy-mm-dd‘),‘女‘) ; INSERT INTO person(pid,name,age,birthday,sex) VALUES (‘22222222222222222‘,‘張三‘,30,TO_DATE(‘1976-02-13‘,‘yyyy-mm-dd‘),‘女‘) ;
第一條數據正常插入,第二條數據,名字違反了唯一約束條件,所以出現了以下的錯誤信息:
ORA-00001: 違反唯一約束條件 (SCOTT.SYS_C0011329)
此錯誤信息,也是使用自動的約束名稱編號,所以要想指定約束的名稱,也可以通過 CONSTRAINT關鍵字進行命名:
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) NOT NULL , age NUMBER(3) NOT NULL , birthday DATE , sex VARCHAR2(2) DEFAULT ‘男‘ , CONSTRAINT person_pid_pk PRIMARY KEY(pid) , CONSTRAINT person_name_uk UNIQUE(name) ) ;
檢查約束(CHECK)
使用檢查約束來判斷一個列中插入的內容是否合法,例如:年齡的取值範圍、性別的取值範圍。
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) NOT NULL , age NUMBER(3) NOT NULL CHECK(age BETWEEN 0 AND 150), birthday DATE , sex VARCHAR2(2) DEFAULT ‘男‘ CHECK(sex IN (‘男‘,‘女‘,‘中‘)), CONSTRAINT person_pid_pk PRIMARY KEY(pid) , CONSTRAINT person_name_uk UNIQUE(name) ) ;
範例:插入錯誤的年齡
INSERT INTO person(pid,name,age,birthday,sex) VALUES (‘11111111111111111‘,‘張三‘,300,TO_DATE(‘1976-02-13‘,‘yyyy-mm-dd‘),‘女‘) ;
錯誤信息:ORA-02290: 違反檢查約束條件 (SCOTT.SYS_C0011332)
錯誤信息中的所有約束錯誤都是采用的自動命名的形式,那麽在 CHECK 中也可以使用手工命名的形式:
DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) NOT NULL , age NUMBER(3) NOT NULL, birthday DATE , sex VARCHAR2(2) DEFAULT ‘男‘, CONSTRAINT person_pid_pk PRIMARY KEY(pid) , CONSTRAINT person_name_uk UNIQUE(name) , CONSTRAINT person_age_ck CHECK(age BETWEEN 0 AND 150) , CONSTRAINT person_sex_ck CHECK(sex IN (‘男‘,‘女‘,‘中‘)) ) ;
主- 外鍵約束(FOREIGN KEY)
主-外鍵約束是針對於兩張表的約束,在使用主-外鍵關聯的時候也要有以下的註意點;
- 在子表中設置的外鍵在父表中必須是主鍵
- 刪除時應該先刪除子表,再刪除父表
存在關聯關系無法刪除子表,強制性的刪除,不管約束,而直接刪除,但是這種做法一般不使用
DROP TABLE book CASCADE CONSTRAINT ;
父表與子表存在關聯數據,想要刪除父表數據必須先將子表中對應數據刪除
如果,希望一個表中的數據在刪除時,可以自動刪除掉其對應的子表記錄,則就可以使用級聯刪除的操作
DROP TABLE book ; DROP TABLE person ; CREATE TABLE person ( pid VARCHAR2(18) , name VARCHAR2(200) NOT NULL , age NUMBER(3) NOT NULL, birthday DATE , sex VARCHAR2(2) DEFAULT ‘男‘, CONSTRAINT person_pid_pk PRIMARY KEY(pid) , CONSTRAINT person_name_uk UNIQUE(name) , CONSTRAINT person_age_ck CHECK(age BETWEEN 0 AND 150) , CONSTRAINT person_sex_ck CHECK(sex IN (‘男‘,‘女‘,‘中‘)) ) ; CREATE TABLE book ( bid NUMBER PRIMARY KEY NOT NULL , bname VARCHAR(30) , bprice NUMBER(5,2) , pid VARCHAR2(18) , CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid) ON DELETE CASCADE ) ;
修改約束
添加約束的語法如下:
ALTER TABLE 表名稱 ADD CONSTRAINT 約束名稱 約束類型(約束字段) ;
關於約束類型的命名一定要統一:
- · PRIMARY KEY:主鍵字段_PK
- · UNIQUE:字段_UK
- · CHECK:字段_CK
- · FOREIGN KEY:父字段_子字段_FK
如果要想增加主-外鍵約束,則可以創建一個沒有約束的 book 表
DROP TABLE book ; CREATE TABLE book ( bid NUMBER, bname VARCHAR(30) , bprice NUMBER(5,2) , pid VARCHAR2(18) ) ;
為表中增加主鍵、外鍵約束
ALTER TABLE book ADD CONSTRAINT book_bid_PK PRIMARY KEY(bid) ; ALTER TABLE book ADD CONSTRAINT person_book_pid_fk FOREIGN KEY(pid) REFERENCES person(pid) ONDELETE CASCADE ;
可以增加約束,那麽就可以刪除約束,刪除約束的時候要指定約束的名稱
ALTER TABLE 表名稱 DROP CONSTRAINT 約束名稱 ;
約束(11)