iT邦幫忙

2022 iThome 鐵人賽

DAY 12
1
自我挑戰組

三十天,PG與我系列 第 12

PostgreSQL表格欄位資料限制與驗證設定

  • 分享至 

  • xImage
  •  

PostgreSQL上面可以對table上每一行的各個資料欄位進行設定,來規範裡面所存的數值。例如"該欄位的值是否有定義?" "該欄位的值和其他行的相同欄位相比是否獨特?"以及"欄位數值的大小是否符合特定條件?"

  • NOT NULL
    規範資料行該欄位的值不能為空,可以在表格建立的時候指定該屬性
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    department VARCHAR(50),
    price INTEGER NOT NULL,
    weight INTEGER
);

或者在table建立之後透過ALTER TABLE指令來添加

ALTER TABLE products
ALTER COLUMN price
SET NOT NULL;

指令下去之後,如果之後對table的操作會破壞此限制,像是往products table插入price為空的值,或者在ALTER TABLE之前有不符合NOT NULL限制的資料行,都會出現錯誤的訊息。

  • DEFAULT
    設定欄位在資料行插入時,若未指定內容則自動帶入的預設值
    在表格建立的時候指定該屬性
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    department VARCHAR(50) NOT NULL,
    price INTEGER DEFAULT 999,
    weight INTEGER
);

或者在table建立之後透過ALTER TABLE指令來添加

ALTER TABLE products
ALTER COLUMN price
SET DEFAULT 999;
  • UNIQUE
    設定指定欄位的內容在多個資料行之間不允許重複
    在表格建立的時候指定該屬性
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL UNIQUE,
    department VARCHAR(50) NOT NULL,
    price INTEGER DEFAULT 999,
    weight INTEGER
);

或者在table建立之後透過ALTER TABLE指令來添加

ALTER TABLE products
ADD UNIQUE(name);

指令下去之後,如果之後對table的操作會破壞此限制,像是往products table插入的資料行其name欄位內容在table中其他資料行已出現過,或者在ALTER TABLE之前有上述情形發生,都會出現錯誤的訊息。
我們也可以針對多個欄位建立UNIQUE constraint,像是如果要針對name跟department兩個欄位建立UNIQUE CONSTRAINT,在table建立時可以輸入

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    department VARCHAR(50) NOT NULL,
    price INTEGER DEFAULT 999,
    weight INTEGER,
    UNIQUE (name, department)
);

或者在table建立之後透過ALTER TABLE指令來添加

ALTER TABLE products
ADD UNIQUE(name, department);
  • CHECK
    這項constraint設定欄位的值必須符合某種條件,假設我們要設定price的值必須是大於零,在建立table的時候可以使用
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    department VARCHAR(50) NOT NULL,
    price INTEGER CHECK(price > 0),
    weight INTEGER
);

或者在table建立之後透過ALTER TABLE指令來添加

ALTER TABLE products
ADD CHECK(price > 0);

這樣子設定完成之後,如果之後對table的操作會讓小於0的資料在price欄位中出現,資料庫就會回傳錯誤的訊息而無法完成動作。
CHECK constraint也可以針對多個欄位進行比較,例如以下CREATE TABLE指令

CREATE TABLE orders(
    id SERIAL PRIMARY KEY,
    name VARCHAR(40) NOT NULL,
    created_at TIMESTAMP NOT NULL,
    est_delivery TIMESTAMP NOT NULL,
    CHECK(created_at < est_delivery)
);

可以確保資料庫中同一行created_at創建日期不會大於est_delivery預計送達日期。


上一篇
SQL語法-window function
下一篇
SQL語法中的邏輯判斷
系列文
三十天,PG與我30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言