參看連接sql
PG建立表數據庫
PG提供:普通表、臨時表、無日誌表、繼承表、基於複合類型表、外部表spa
CREATE TABLE tb_products ( id integer, name text, price numeric );
CREATE TABLE tb_products ( id integer, name text, price numeric DEFAULT 9.99 --DEFAULT關鍵字,9.99是字段price的默認值。 ); CREATE TABLE tb_products ( id SERIAL, --SERIAL自增字段, autonumber name text, price numeric DEFAULT 9.99 );
DROP TABLE tb_products;
約束類型:外鍵約束、惟一性約束、檢查約束、排他性約束日誌
字段裏的數值必須知足一個布爾表達式。此外,也能夠聲明表級別的檢查約束。 code
CREATE TABLE tb_products ( id integer, name text, --price字段的值必須大於0,不然插入或修改該字段值,將引起錯誤。 --匿名約束,PostgreSQL將會根據當前的表名、字段名和約束類型, --爲該約束自動命名,如:products_price_check。 price numeric CHECK (price > 0) ); CREATE TABLE tb_products ( id integer, name text, --顯式約束,名爲positive_price。 --好處:維護該約束時,可根據該名進行直接操做。 price numeric CONSTRAINT positive_price CHECK (price > 0) );
字段不能插入、更新爲空值blog
CREATE TABLE tb_products ( id integer NOT NULL, name text NOT NULL, price numeric );
字段中存在多個約束,定義時不用考慮聲明順序。繼承
CREATE TABLE tb_products ( id integer NOT NULL, name text NOT NULL, price numeric NOT NULL CHECK (price > 0) );
字段不能插入、更新爲當前表中的已有值索引
CREATE TABLE tb_products ( id integer UNIQUE, name text, price numeric ); CREATE TABLE tb_products ( id integer, name text, price numeric, UNIQUE (product_no) );
CREATE TABLE example ( a integer, b integer, c integer, UNIQUE (a, c) );
CREATE TABLE tb_products ( id integer CONSTRAINT must_be_different UNIQUE, name text, price numeric );
在插入數據時,空值(NULL)之間被視爲不相等的數據,所以對於某一惟一性字段,能夠屢次插入空值。然而須要注意的是,這一規則並非被全部數據庫都遵照,所以在進行數據庫移植時可能會形成必定的麻煩。 事務
主鍵約束惟一約束和非空約束的組合ip
CREATE TABLE tb_products ( id integer PRIMARY KEY, --字段product_no被定義爲該表的惟一主鍵。 name text, price numeric );
CREATE TABLE example ( a integer, b integer, c integer, PRIMARY KEY (b, c) );
CREATE TABLE orders ( order_id integer PRIMARY KEY, --主鍵。 --該表的id字段是外鍵,爲products表主鍵(id)。 id integer FOREIGN KEY REFERENCES products(product_no), quantity integer ); CREATE TABLE t1 ( a integer PRIMARY KEY, b integer, c integer, --該外鍵的字段數量和被引用表中主鍵的數量必須保持一致。 FOREIGN KEY (b, c) REFERENCES example (b, c) );
當多個表存在主外鍵的參考性約束關係時。若是想刪除被參照表某行記錄,因爲該行記錄的主鍵字段值可能在參照表中某條記錄所關聯,因此刪除操做將會失敗。
CREATE TABLE tb_products ( pid integer PRIMARY KEY, name text, price numeric ); CREATE TABLE tb_orders ( order_id integer PRIMARY KEY, shipping_address text ); CREATE TABLE tb_order_items ( pid integer REFERENCES tb_products ON DELETE RESTRICT, --限制選項 order_id integer REFERENCES tb_orders ON DELETE CASCADE, --級聯刪除選項 quantity integer, PRIMARY KEY (pid, order_id) );
RESTRICT :禁止刪除被引用的行。
NO ACTION :的意思是若是在檢查約束的時候,若是還存在任何引用行,則拋出錯誤; 若是你不聲明任何東西,那麼它就是缺省的行爲。(這兩個選擇的實際區別是,NO ACTION 容許約束檢查推遲到事務的晚些時候,而 RESTRICT 不行。)
CASCADE :聲明在刪除一個被引用的行的時候,引用它的行也會被自動刪除掉。 在外鍵字段上的動做還有兩個選項: SET NULL 和 SET DEFAULT。 這樣會致使在被引用行刪除的時候,引用它們的字段分別設置爲空或者缺省值。 請注意這些選項並不能讓你逃脫被觀察和約束的境地。好比,若是一個動做聲明 SET DEFAULT,可是缺省值並不能知足外鍵,那麼動做就會失敗。
相似ON DELETE,還有ON UPDATE 選項,它是在被引用字段修改(更新)的時候調用的。可用的動做是同樣的。
ALTER TABLE tb_products ADD COLUMN description text;
### 在新增字段時,能夠同時給該字段指定約束。
ALTER TABLE tb_products ADD COLUMN description text CHECK(description <> '');
ALTER TABLE tb_products DROP COLUMN description;
若是該表爲被參照表,該字段爲被引用字段,那麼上面的刪除操做將會失敗。若是要想在刪除被引用字段的同時級聯的刪除其全部引用字段,能夠採用下面的語法形式。
ALTER TABLE tb_products DROP COLUMN description CASCADE;
ALTER TABLE tb_products ADD CHECK(name <> ''); --增長一個表級約束 ALTER TABLE tb_products ADD CONSTRAINT some_name UNIQUE(pid);--增長命名的惟一性約束。 ALTER TABLE tb_products ADD FOREIGN KEY(pdt_grp_id) REFERENCES pdt_grps; --增長外鍵約束。 ALTER TABLE tb_products ALTER COLUMN pid SET NOT NULL; --增長一個非空約束。
ALTER TABLE tb_products DROP CONSTRAINT some_name;
對於顯示命名的約束,能夠根據其名稱直接刪除,對於隱式自動命名的約束,能夠經過psql的\d tablename來獲取該約束的名字。和刪除字段同樣,若是你想刪除有着被依賴關係地約束,你須要用CASCADE。一個例子是某個外鍵約束依賴被引用字段上的惟一約束或者主鍵約束。如:
MyTest=# \d products
Table "public.products"
Column | Type | Modifiers
------------+---------+-----------
product_no | integer |
name | text |
price | numeric |
Check constraints:
"positive_price" CHECK (price > 0::numeric)
ALTER TABLE tb_products ALTER COLUMN product_no DROP NOT NULL;
ALTER TABLE tb_products ALTER COLUMN price SET DEFAULT 7.77;
ALTER TABLE tb_products ALTER COLUMN price DROP DEFAULT;
ALTER TABLE tb_products ALTER COLUMN price TYPE numeric(10,2);
ALTER TABLE tb_products RENAME COLUMN pid TO product_number;
ALTER TABLE tb_products RENAME TO items;
1、索引