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