完整約束二
阿新 • • 發佈:2019-04-05
not 例如 das 技術分享 完整 into copy alt info
約束分以下幾種:
- 非空約束:如果使用了非空約束,則以後些字段的內容不允許設置為NULL (NOT NULL)
- 唯一約束:即此列的內容不允許出重復UK
- 主鍵約束:表示一個唯一的標識,例如:人員ID不能重復,且不能為空PK
- 檢查約束:用戶自行編寫設置內容的檢查條件;CK
- 主外鍵約束:在2張表上進行的關聯的約束,加入關聯約束之後就產生了父子關系
非空約束NK:
示例一、創建member表,其中姓名不允許為空
創建表 CREATE TABLE MEMBER( mid NUMBER, NAME VARCHAR2(30) NOT NULL ); 非空只需要在定義的字段後寫 NOT NULL 查看表結構 DESC member;
此時向表中添加數據
錯誤寫法: INSERT INTO MEMBER(mid,NAME) VALUES(1);, 會提示沒有足夠的值
錯誤的寫法二 INSERT INTO MEMBER(mid,NAME) VALUES(1,NULL); 無法將NULL值插入member.name字段
看提示信息:由tests用戶名,member表名,name字段名組成
非空約束:會提示完整的信息
因name字段在設置了NOT NULL非空約束就不能不寫,或者寫NULL都是錯誤
正確的寫法:
INSERT INTO MEMBER(mid,NAME) VALUES(1,‘劉楠‘);
唯一約束 UK:
唯一約束—在字段後加上UNIQUE
創建表 CREATE TABLE MEMBER( mid NUMBER, NAME VARCHAR2(30) NOT NULL, email VARCHAR2(50) UNIQUE ); --添加數據 --正確 INSERT INTO MEMBER(mid,NAME,Email) VALUES(1,‘劉楠‘,‘[email protected]‘); 可以添加成功
示例二、添加錯誤的信息
下面添加錯誤數據—email和上面一樣 INSERT INTO MEMBER(mid,NAME,Email) VALUES(2,‘張三‘,‘[email protected]‘);
由於email設置了唯一約束,所以會報錯
提示違反唯一約束條件
但提示信息完全看不明白,因為沒有給約束起別名
使用CONSTRAINT來定義約束,定義
正確的唯一約束寫法
--先刪除 DROP TABLE MEMBER PURGE; --創建表 CREATE TABLE MEMBER( mid NUMBER, NAME VARCHAR2(30) NOT NULL, email VARCHAR2(50) , CONSTRAINT uk_email UNIQUE(email) );
為唯一約束起別名UK_EMAIL
也可以用以下方法添加
推薦創建表時添加, 盡量不使用ALTER ALTER TABLE 表名 ADD CONSTRAINT UK_email UNIQUE(email)
添加正確數據
NSERT INTO MEMBER(mid,NAME,Email) VALUES(1,‘劉楠‘,‘[email protected]‘); --可以添加成功
添加錯誤數據
添加錯誤數據—email和上面一樣 INSERT INTO MEMBER(mid,NAME,Email) VALUES(2,‘張三‘,‘[email protected]‘);
提示違反唯一約束條件
提示信息會有tests用戶名,UK_EMAIL約束名
信息比較完整
唯一約束可以為NULL,NULL不受唯一約束的影響
INSERT INTO MEMBER(mid,NAME,Email) VALUES(2,‘張三‘,null); INSERT INTO MEMBER(mid,NAME,Email) VALUES(3,‘李四‘,null); --查詢 SELECT * FROM MEMBER;
主鍵約束PK:
PRIMARY KEY(PK)
--創建表—添加主鍵約束只要在字段後加上PRIMARY KEY就可以
CREATE TABLE MEMBER ( mid NUMBER PRIMARY KEY, NAME VARCHAR2(20) NOT NULL, email VARCHAR2(30), CONSTRAINT uk_mail UNIQUE(email) ); --正確 INSERT INTO MEMBER(mid,NAME,Email) VALUES(1,‘劉楠‘,‘[email protected]‘);
添加錯誤信息:
INSERT INTO MEMBER(mid,NAME,Email) VALUES(1,‘劉楠‘,‘[email protected]‘); 此時會提示
但提示信息不完整,
一般用CONSTRAINT 添加約束名
CONSTRAINT PK_MID PRIMARY KEY(mid)
--先刪除 DROP TABLE MEMBER PURGE; --創建表 CREATE TABLE MEMBER( mid NUMBER, NAME VARCHAR2(30) NOT NULL, email VARCHAR2(50), --添加唯一約束指定約束名 CONSTRAINT uk_email UNIQUE(email), --添加主鍵約束指定約束名 CONSTRAINT pk_mid PRIMARY KEY(mid) );
--正確 INSERT INTO MEMBER(mid,NAME,Email) VALUES(1,‘劉楠‘,‘[email protected]‘); --錯誤 INSERT INTO MEMBER(mid,NAME,Email) VALUES(1,‘劉楠‘,‘[email protected]‘); 此時會提示
提示信息就會提示tests用戶名,PK_MID約束名
添加約束時盡量都使用CONSTRAINT 來添加約束名,有錯誤時才容易找到原因
檢查約束CK:
CHECK 簡稱CK
只需要在字段後加上就好
如年齡字段設置 CHECK(age BETWEEN 0 AND 200), 最好用CONSTRAINT來添加約束名
最好用CONSTRAINT來添加約束名 CONSTRAINT CK_age CHECK(age BETWEEN 0 AND 200); 性別 CONSTRAINT CK_sex CHECK (sex IN (‘男’,’女’) )
--先刪除 DROP TABLE MEMBER PURGE; --創建表 CREATE TABLE MEMBER ( mid NUMBER , NAME VARCHAR2(20) NOT NULL, email VARCHAR2(30), age number(3), sex VARCHAR2(10), --創建主鍵約束 CONSTRAINT PK_mid PRIMARY KEY(mid), --創建唯一約束 CONSTRAINT UK_email UNIQUE(email), --創建檢查約束 CONSTRAINT CK_age CHECK(age BETWEEN 0 AND 200), --創建檢查約束 CONSTRAINT CK_sex CHECK(sex IN (‘男‘,‘女‘)) ); --向表中添加正確數據 INSERT INTO MEMBER(mid,Name,Email,Age,Sex) VALUES(1,‘劉楠‘,‘[email protected]‘,30,‘男‘); 添加成功 select * from member; 查看成功
添加錯誤的數據年齡為300歲
INSERT INTO MEMBER(mid,Name,Email,Age,Sex) VALUES(2,‘張三豐‘,‘[email protected]‘,300,‘男‘);
有CONSTRAINT起的約束名就很好的找到問題所在
完整約束二