1. 程式人生 > >SQL之約束

SQL之約束

約束

約束條件包括:
非空約束(Not Null),簡稱NN
唯一性約束(Unique),簡稱UK
主鍵約束(Primary Key),簡稱PK
外來鍵約束(Foreign Key),簡稱FK
檢查約束(Check),簡稱CK

非空約束

非空約束用於確保欄位值不為空。預設情況下,任何列都允許有空值,但業務邏輯可能會要求某些列不能取空值。當某個欄位被設定了非空約束條件,這個欄位中必須存在有效值,即:
*當執行INSERT操作時,必須提供這個列的資料
*當執行UPDATE操作時,不能給這個列的值設定為NULL

建表時新增非空約束

CREATE TABLE employees_swm(
    eid NUMBER(6),
    name VARCHAR2(30) NOT NULL,
    salary NUMBER(7,2),
    HIREDATE DATE CONSTRAINT employees_hiredate_nn_swm NOT NULL
)
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

修改表時新增非空約束

可以在建表之後,通過修改表的定義,新增非空約束

ALTER TABLE employees_swm
MODIFY (eid 
NUMBER(6) NOT NULL)
  • 1
  • 2

唯一性約束

唯一性(Unique)約束條件用於保證欄位或者欄位的組合不出現重複值。當給表的某個列定義了唯一約束條件,該列的值不允許重複,但允許是NULL值。
唯一性約束條件可以在建表同時建立,也可以在建表以後再建立。

新增唯一性約束

在建表employees的同時,在eid、email列上建立唯一約束條件,並在建表後在name列上建立一個名為employees_name_uk的唯一約束條件:

CREATE TABLE employees1_swm(
    eid 
NUMBER(6) UNIQUE, name VARCHAR2(30), email VARCHAR2(50), salary NUMBER(7, 2), hiredate DATE, CONSTRAINT employees_email_uk_swm UNIQUE(email) )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在建表之後增加唯一性約束條件:

ALTER TABLE employees1_swm
ADD CONSTRAINT employees_name_uk UNIQUE(name);
   
  • 1
  • 2
INSERT INTO employees1_swm
    (eid,name,email)
VALUES
    (1,'JACK','[email protected]')
   
  • 1
  • 2
  • 3
  • 4

主鍵約束

主鍵(Primary Key)約束條件從功能上看相當於非空(NOT NULL)且唯一(UNIQUE)的組合。
主鍵欄位可以是單欄位或多欄位組合,即:在主鍵約束下的單欄位或者多欄位組合上不允許有空值,也不允許有重複值。
主鍵可以用來在表中唯一的確定一行資料。一個表上只允許建立一個主鍵,而其它約束條件則沒有明確的個數限制。

主鍵選取的原則

主鍵應是對系統無意義的資料
永遠也不要更新主鍵,讓主鍵除了唯一標識一行之外,再無其他的用途
主鍵不應包含動態變化的資料,如時間戳
主鍵應自動生成,不要人為干預,以免使它帶有除了唯一標識一行以外的意義
主鍵儘量建立在單列上

新增主鍵約束條件

在建表時新增主鍵約束條件

CREATE TABLE employees2_swm(
    eid NUMBER(6) PRIMARY KEY,
    name VARCHAR2(30),
    email VARCHAR2(50),
    salary NUMBER(7,2),
    hiredate DATE
)
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

建表後建立主鍵約束條件,並自定義約束條件名稱

ALTER TABLE employees2_swm
ADD CONSTRAINT employees2_swm_eid_pk PRIMARY KEY (eid);
   
  • 1
  • 2

外來鍵約束(幾乎不用)

外來鍵約束的意義
外來鍵約束條件定義在兩個表的欄位或一個表的兩個欄位上,用於保證相關兩個欄位的關係。比如emp表的deptno列參照dept表的deptno列,則dept稱作主表或父表,emp表稱作從表或子表。

新增外來鍵約束

建表時新增外來鍵約束條件

CREATE TABLE employees4 (
eid NUMBER(6),
name VARCHAR2(30),
salary NUMBER(7, 2),
deptno NUMBER(4)
);
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在建表後建立外來鍵約束條件

ALTER TABLE employees4
ADD CONSTRAINT employees4_deptno_fk 
FOREIGN KEY (deptno) REFERENCES dept(deptno);
   
  • 1
  • 2
  • 3

外來鍵約束對一致性的維護

外來鍵約束條件包括兩個方面的資料約束:
從表上定義的外來鍵的列值,必須從主表被參照的列值中選取,或者為NULL;
當主表參照列的值被從表參照時,主表的該行記錄不允許被刪除。

--成功DML語句:
INSERT INTO employees4(eid, name, deptno) 
    VALUES(1234, ‘rose tyler’, 40);--成功
INSERT INTO employees4(eid, name, deptno) 
    VALUES(1235, ‘martha jones’, NULL); --成功
--失敗DML語句:
INSERT INTO   employees4(eid, name, deptno) 
    VALUES(1236, 'donna noble', 50);
    --失敗,不存在部門50
DELETE FROM dept WHERE deptno  = 40;
    --失敗,40被參照,不允許刪除
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

外來鍵約束對效能的降低

如果在一個頻繁DML操作的表上建立外來鍵,每次DML操作,都將導致資料庫自動對外來鍵所關聯的對應表做檢查,產生開銷,如果已在程式中控制邏輯,這些判斷將增加額外負擔,可以省去。
另外外來鍵確定了主從表的先後生成關係,有時會影響業務邏輯。

關聯不一定需要外來鍵約束

如果業務邏輯要求保證資料完整性,可由程式或觸發器控制,不一定需要外來鍵約束。
另外為了簡化開發,維護資料時不用考慮外來鍵約束,以及大量資料DML操作時不需考慮外來鍵耗費時間。

檢查約束

檢查(Check)約束條件用來強制在欄位上的每個值都要滿足Check中定義的條件。當定義了Check約束的列新增或修改資料時,資料必須符合Check約束中定義的條件。

新增檢查約束

員工的薪水必須大於2000元,增加檢查約束:

ALTER TABLE employees2_swm
ADD CONSTRAINT employees2_swm_salary_check
CHECK (salary > 2000);
   
  • 1
  • 2
  • 3

當插入大於2000的資料,操作成功:

INSERT INTO employees2_swm
    (eid,name,salary,deptno)
VALUES
    (1234,'donna noble',2400,40)
   
  • 1
  • 2
  • 3
  • 4

試圖修改職員的薪水為1500元,更新失敗:

UPDATE employees2_swm
SET salary=1500
WHERE eid=1234
   
  • 1
  • 2
  • 3

轉自IsSwm的部落格:https://blog.csdn.net/qq_27853161/article/details/53608699