值得收藏的好文——postgresql 增加約束、刪除約束、增加列、刪除列

修改表

刪除約束[語法通用]

alter table table_name drop constraint "some_name";

說明:
1.需要明確操作哪個表
2.需要知道約束的名稱[可以是主鍵約束,外鍵約束,check約束,unique約束]
3.這對除了非空約束之外所有的約束類型都一樣有效

移除非空約束

alter table table_name alter column ID drop not null;

說明:由於非空約束沒有名稱,因此不能使用上面的方法。

表中的version字段添加check約束

alter table table_name add constraint "table_name_version_check"
check(version between '8-1' and '8-z');

表中字段添加唯一約束unique

alter table table_name add constraint "unique_table_name" unique(id);

增加外鍵約束

alter table table_name add foreign key (table_name_id) 
references table_name2(table_name2_id) 
on update cascade on delete cascade;

說明:
on update cascade: 被引用行更新時,引用行自動更新;
on update restrict: 被引用的行禁止更新;
on delete cascade: 被引用行刪除時,引用行也一起刪除;
on dellete restrict: 被引用的行禁止刪除;

增加主鍵約束

alter table table_name add primary key(id);

表中的字段增加非空約束

alter table table_name alter column ID set not null;

說明:該約束會立即被檢查,所以表中的數據在增加非空約束之前需要滿足約束條件

增加列

alter table table_name add column name text;

說明:
新列若沒有指定默認值,則會填充null

刪除列

alter table table_name drop column name;

補充說明:
如果該列是另一個表的外鍵所引用,刪除會失敗。通過cascade來授權移除任何依賴於被刪除列的所有東西。

alter table table_name drop column name cascade;

更改列的默認值

 ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77; 

說明:
這不會影響任何表中已經存在的行,它只是爲未來的INSERT命令改變了默認值。

刪除列的默認值

ALTER TABLE products ALTER COLUMN price DROP DEFAULT;

說明:
這等同於將默認值設置爲空值。相應的,試圖刪除一個未被定義的默認值並不會引發錯誤, 因爲默認值已經被隱式地設置爲空值

修改列的數據類型

ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2); 

說明:只有當列中的每一個項都能通過一個隱式造型轉換爲新的類型時該操作才能成功。

重命名列

ALTER TABLE products RENAME COLUMN product_no TO product_number; 

重命名錶

ALTER TABLE products RENAME TO items; 

創建表時增加約束

檢查約束

列約束

CREATE TABLE products ( 
     product_no integer, 
     name text, 
     price numeric CONSTRAINT positive_price CHECK (price > 0) 
); 

說明:如果不指定名稱CONSTRAINT positive_price 可以省略

表約束

CREATE TABLE products ( 
    product_no integer, 
    name text, 
    price numeric CHECK (price > 0), 
    discounted_price numeric CHECK (discounted_price > 0), 
    CHECK (price > discounted_price) 
); 

說明:

  1. CHECK (price > discounted_price) 該約束條件沒有依附於任何一個列,屬於表級約束
  2. 列約束和表約束可以同時存在
  3. 列約束可以寫成表約束,但是反過來不行

將列約束改成表約束

CREATE TABLE products ( 
    product_no integer, 
    name text, 
    price numeric, 
    CHECK (price > 0), 
    discounted_price numeric, 
    CHECK (discounted_price > 0), 
    CHECK (price > discounted_price) 
); 

說明:
一個檢查約束在其檢查表達式值爲真或空值時被滿足。因爲當任何操作數爲空(null)時大部分表達式將計算爲空值,所以它們不會阻止被約束列中的控制。爲了保證一個列不包含空值,可以使用非空約束not null。

非空約束

CREATE TABLE products ( 
    product_no integer NOT NULL, 
    name text NOT NULL, 
    price numeric NOT NULL CHECK (price > 0) 
); 

說明:一個列可以有多個約束,約束的順序無關。

唯一約束

CREATE TABLE products ( 
    product_no integer CONSTRAINT must_be_different UNIQUE, 
    name text, 
    price numeric 
); 

說明:
1.可以自己指定約束的名稱,CONSTRAINT must_be_different 可以省略,省略後則會有系統指定名稱
2. 增加一個唯一約束會在約束中列出的列或列組上自動創建一個唯一B-tree索引
3. 如果表中有超過一行在約束所包括列上的值相同,將會違反唯一約束。但是在這種比較中,兩個空值(null)被認爲是不同的。即便存在一個唯一約束,也可以存儲多個在至少一個被約束列中包含空值的行。

列約束

CREATE TABLE products ( 
    product_no integer UNIQUE, 
    name text, 
    price numeric 
); 

表約束

CREATE TABLE products ( 
    product_no integer, 
    name text, 
    price numeric, 
    UNIQUE (product_no) 
); 

說明:這種寫法和上面的列約束不同,但是實現的效果一樣

CREATE TABLE example ( 
    a integer, 
    b integer, 
    c integer, 
    UNIQUE (a, c) 
); 

說明: 這指定這些列的組合值在整個表的範圍內是唯一的,但其中任意一列的值並不需要是唯一的。

主鍵約束

CREATE TABLE products ( 
    product_no integer PRIMARY KEY, 
    name text, 
    price numeric 
); 

說明:
1.主鍵唯一且非空
2.主鍵可以有多個列,聯合主鍵
3.增加一個主鍵將自動在主鍵中列出的列或列組上創建一個唯一B-tree索引。並且會強制這些列被標記爲NOT NULL

外鍵約束

外鍵的定義:
一個外鍵約束指定一列(或一組列)中的值必須匹配出現在另一個表中某些行的值。我們說
這維持了兩個關聯表之間的引用完整性。

舉例如下:
產品表:

CREATE TABLE products ( 
    product_no integer PRIMARY KEY, 
    name text, 
    price numeric 
); 

假設還有一個存儲這些產品訂單的表。我們希望保證訂單表中只包含真正存在的產品的訂單。因此我們在訂單表中定義一個引用產品表的外鍵約束:

訂單表:

CREATE TABLE orders ( 
    order_id integer PRIMARY KEY, 
    product_no integer REFERENCES products (product_no), 
    quantity integer 
); 

現在就不可能創建包含不存在於產品表中的product_no值(非空)的訂單。我們說在這種情況下,訂單表是引用表而產品表是被引用表。相應地,也有引用和被引用列的說法。

訂單表簡寫:

CREATE TABLE orders ( 
    order_id integer PRIMARY KEY, 
    product_no integer REFERENCES products, 
    quantity integer 
); 

說明:若爲指定被引用列,則被引用表的主鍵將被用作被引用列

說明

以上來自平時的總結或參考自 PostgreSQL 11.2 手冊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章