1. 程式人生 > >完整約束二

完整約束二

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起的約束名就很好的找到問題所在

完整約束二