1. 程式人生 > >約束(11)

約束(11)

判斷 image 字段名 sco style drop nbsp alter date

約束的分類

在實際中,約束主要分為以下五種約束:

  • · 主鍵約束:主鍵表示是一個唯一的標識,本身不能為空

  |- 例如:身份證編號是唯一的,不可重復的,不可為空的

  • · 唯一約束:在一個表中只允許建立一個主鍵約束,而其他列如果不希望出現重復值的話,則就可以使用唯一約束
  • · 檢查約束:檢查一個列的內容是否合法

  |- 例如:年齡,只能在 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 TABLE
person ; 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)