PostgreSQL數據庫平常學習筆記13-約束

PostgreSQL常見約束有檢查約束、非空約束、惟一約束、主鍵約束和外鍵約束等,部分約束類型還能夠指定多列,指定多列本文不介紹過多,請參考PostgreSQL數據庫手冊。下文將一一詳加介紹。數據庫

首先咱們介紹檢查約束。檢查約束要求數據必須知足某些條件,例如數值必須大於或小於某些值,或在某字段等。測試

---建立員工信息表
---性別值爲0或1
create table "workerInformation"(
    workerid int,
    "workerName" varchar(30),
    "workerBirthday" date,
    "workerSex" int check ("workerSex"=0 or "workerSex"=1)
);

#CREATE TABLE

#Query returned successfully in 139 msec.

下面咱們嘗試插入正常數據。code

insert into "public"."workerInformation"(workerid,"workerName","workerBirthday","workerSex") values(1,'顧留芳','0670-1-1',1);
insert into "public"."workerInformation"(workerid,"workerName","workerBirthday","workerSex") values(2,'林業平','0770-1-1',1);

下面插入錯誤數據,須要指出表中某列名有大小寫等特殊狀況須要表名加英文雙引號""。orm

insert into "public"."workerInformation"(workerid,"workerName","workerBirthday","workerSex") values(3,'徐長卿','0770-1-1',2);
#ERROR:  new row for relation "workerInformation" violates check constraint  "workerInformation_workerSex_check" 
#DETAIL:  Failing row contains (3, 徐長卿, 0770-01-01, 2).
#SQL 狀態:23514

數據庫有如上錯誤提示,下面修改成正確數據。產品

insert into "public"."workerInformation"(workerid,"workerName","workerBirthday","workerSex") values(3,'徐長卿','0865-1-1',1);

); 數據插入成功。it

下面介紹非空約束。非空約束很容易理解,就是要求數據不能爲空,列內須要有數據。聲明非空列使用關鍵字 not null (或 NOT NULL)。io

先建立表。table

CREATE TABLE products (
    "productNO" integer NOT NULL,
    name text NOT NULL,
    price numeric
);

插入正常數據form

INSERT INTO "public".products VALUES(1,'統一老壇酸菜牛肉麪',3.6);
INSERT INTO "public".products VALUES(2,'',2);

插入以下錯誤數據軟件

INSERT INTO "public".products VALUES(2,,2);

軟件會提示錯誤,插入容許爲空數據時,該列值須要聲明值爲NULL,不然軟件也會提示錯誤。

接上文代碼,連續屢次執行代碼

---執行2以上
INSERT INTO "public".products VALUES(3,'',2);

執行查詢語句

SELECT * FROM "public".products;

會發現有多行相同數據。

"相同列"

刪除原表並新建新表。

---"productNO"惟一約束
CREATE TABLE products (
    "productNO" integer UNIQUE,
    name text,
    price numeric
);

執行測試代碼。

---執行2以上
INSERT INTO "public".products VALUES(3,'',2);

第一次正常執行代碼後,第二次執行代碼軟件會產生錯誤信息。

#ERROR:  duplicate key value violates unique constraint "products_productNO_key"
#DETAIL:  Key ("productNO")=(3) already exists.
#SQL 狀態:23505

主鍵約束,顧名思義就是指定主鍵。

再次刪除測試表products。建立新表並建立主鍵productNO。

---"productNO"建立主鍵productNO
CREATE TABLE products (
    "productNO" integer UNIQUE PRIMARY KEY,
    name TEXT,
    price NUMERIC
);

惟一約束是指當前列不能有重複值。

---建立表並設置"productNO" 列惟一約束
CREATE TABLE products (
    "productNO" integer NOT NULL UNIQUE,
    name text NOT NULL,
    price numeric
);
---另外一種惟一約束寫法
CREATE TABLE products (
    "productNO" INTEGER NOT NULL,
    name TEXT NOT NULL,
    price NUMERIC,
    UNIQUE("productNO")
);
---先建立表
CREATE TABLE products (
    "productNO" INTEGER NOT NULL,
    name TEXT NOT NULL,
    price NUMERIC
);
---後設置約束
ALTER TABLE "public"."products" ADD UNIQUE("productNO");

外鍵約束就是指某一列必須匹配另外一個表某列,用於維持兩個關聯表數據完整性。刪除表須要先刪除引用表,再刪除被引用表。

建立有外鍵表orders 。

---建立訂單表orders 
CREATE TABLE orders (
    "orderID" integer PRIMARY KEY,
    "productNO" integer REFERENCES products ("productNO"),
    quantity integer
);

插入錯誤值後錯誤信息以下:

---產品編號爲3商品不存在
INSERT INTO "public".orders VALUES(1,3,1);

#ERROR:  insert or update on table "orders" violates foreign key constraint "orders_productNO_fkey"
#DETAIL:  Key (productNO)=(3) is not present in table "products".
#SQL 狀態:23503

改爲正確信息後

INSERT INTO "public".orders VALUES(1,2,1);

數據庫腳本執行成功。

相關文章
相關標籤/搜索