1. 程式人生 > >(二).約束關鍵字,約束課堂SQL

(二).約束關鍵字,約束課堂SQL

constraint     約束
PRIMARY     主要的
UNIQUE      獨一無二的	
CHECK		    檢查,核對
FOREIGN     外交的
KEY	關鍵字
REFERENCES  把...引做參考

約束

什麼是約束?

約束就是為了完成資料庫中資料的完整性與一致性的一種檢查機制
通過定義在資料庫中的表來完成約束條件

有哪些約束?

  • 主鍵約束 PRIMARY KEY 唯一加非空

–作用:識別一個行
–要求:在給一個列建立主鍵時不能重複不能為空

 注意:推薦使用無意義且有序的數字作為主鍵,例如1,2,3,4....一張表只能有一個主鍵

SELECT * FROM STUDENT;

建表後加上主鍵約束

ALTER TABLE STUDENT ADD CONSTRAINT PK_STU_ID PRIMARY KEY (ST_ID);

更新主鍵使其符合約束條件

UPDATE STUDENT SET ST_ID=7 WHERE ST_NAME ='娜娜';

INSERT INTO STUDENT(ST_ID) VALUES(8);

CREATE TABLE T_USER(
   T_ID NUMBER(4), --PRIMARY KEY,--CONSTRAINT PK_USER_ID PRIMARY KEY,--行級定義
   T_NAME VARCHAR2(20),
   CONSTRAINT PK_USER_ID PRIMARY KEY(T_ID)  --表級定義
)

SELECT * FROM T_USER;

2.唯一約束 UNIQUE

作用:確保被指定的欄位每行資料不重複,可以為空
建表後建立

ALTER TABLE STUDENT ADD CONSTRAINT UN_STU_NAME UNIQUE(ST_NAME);

建表時建立

CREATE TABLE T_USER(
   T_ID NUMBER(4),
   T_NAME VARCHAR2(20),--UNIQUE,  CONSTRAINT UN_USER_NAME UNIQUE 行級定義
   CONSTRAINT UN_USER_ID UNIQUE(ST_NAME)  --表級定義
)

3.非空約束

作用:指定欄位必填

建表後建立

ALTER TABLE STUDENT MODIFY ST_NAME NOT NULL;

建表時建立

CREATE TABLE T_USER(
   T_ID NUMBER(4),
   T_NAME VARCHAR2(20) NOT NULL
)

4.檢查約束(自定義約束) CHECK

–作用:

建表後建立

ALTER TABLE STUDENT ADD CONSTRAINT CK_STU_SEX
CHECK(((ST_SEX='男') OR (ST_SEX='女')) AND (ST_SEX IS NOT NULL));

建表時建立

CREATE TABLE T_USER(
   T_ID NUMBER(4),
   T_NAME VARCHAR2(20) CHECK(T_NAME='小王子')
    )

5.外來鍵約束 FOREIGN KEY

作用:用來強制兩個表關係,該約束要求定義外來鍵中的每個值必須與引用鍵相匹配
外來鍵:從表中引用主表中的引用鍵的列
引用鍵:被外來鍵引用的主鍵或者唯一鍵

CREATE TABLE T_CLASS(
   C_ID NUMBER(5),
   C_NO NUMBER(5),
   C_TEACHER VARCHAR2(20)
)

建唯一鍵

ALTER TABLE T_CLASS ADD CONSTRAINT UN_CLASS_CNO UNIQUE(C_NO);

INSERT INTO T_CLASS VALUES(1,1809,'樑辰');
INSERT INTO T_CLASS VALUES(2,1810,'驚蟄');

CREATE TABLE T_STU(
   S_ID NUMBER(5),
   S_NAME VARCHAR2(20),
   C_NO NUMBER(5)
)

定義外來鍵

ALTER TABLE T_STU ADD CONSTRAINT FK_STU_CNO
FOREIGN KEY (C_NO) REFERENCES T_CLASS(C_NO);

INSERT INTO T_STU VALUES(1,'談笑人生',1810);
INSERT INTO T_STU VALUES(2,'哈哈哈',1810);
INSERT INTO T_STU VALUES(3,'番茄',1809);

INSERT INTO T_STU VALUES(4,‘再也沒有’,1809);

INSERT INTO T_STU VALUES(5,'孫悟空',1811);

SELECT * FROM T_STU;
SELECT * FROM T_CLASS;



DELETE FROM T_STU WHERE S_ID=1;

DELETE FROM T_CLASS WHERE C_ID=1;

級聯關係

--ON DELETE CASCADE (刪除主表資料順帶刪除對應子表整行資料)
ALTER TABLE T_STU ADD CONSTRAINT FK_STU_CNO
FOREIGN KEY (C_NO) REFERENCES T_CLASS(C_NO) ON DELETE CASCADE;

--ON DELETE SET NULL(刪除主表資料把子表對應外來鍵資料設定為NULL)
ALTER TABLE T_STU ADD CONSTRAINT FK_STU_CNO
FOREIGN KEY (C_NO) REFERENCES T_CLASS(C_NO) ON DELETE      SET NULL;