sql語言修改表結構的一些方法
這次的教材裡面介紹瞭如何用sql語句建立一個數據庫和相應的表結構,也說明了表結構的細節設計如約束等,但是沒有說明如果建立了一個表結構後修改這個結構,是重新建立還是可以直接修改,學員經常會提出這些問題,下面對使用sql語句修改表結構做一個說明。
修改表結構包括:增加欄位、刪除欄位、增加約束、刪除約束、修改預設值、修改欄位資料型別、重新命名欄位、重命名錶。所有這些操作都是用 alter table 命令執行的。
1、增加欄位,增加欄位需要注意的是如果源表裡面已經有相應的值,那麼新增加的欄位需要設定為可以為null,不然會造成增加異常。它的語法是這樣的:
alter table 表名 add 欄位名 欄位型別;
你也可以同時在該欄位上定義約束,使用通常的語法,如:
alter table 表名 add 欄位名 欄位型別 check (新增約束的欄位名 <> '');
實際上,所有在 create table 裡描述的可以應用於欄位之選項都可以在這裡使用。不過,我們要注意的是預設值必須滿足給出的約束,否則 add 將會失敗。
2、 刪除欄位
要刪除一個欄位,使用下面這樣的命令:
alter table 表名 drop column 欄位列名;
不管欄位裡有啥資料,都會消失。和這個欄位相關的約束也會被刪除。 不過,如果這個欄位被另外一個表的外來鍵所引用,postgresql 則不會隱含地刪除該約束。你可以通過使用 cascade 來授權刪除任何依賴該欄位的東西,如:
alter table 表名 drop column 欄位名 cascade;
3、增加約束
要增加一個約束,使用表約束語法。比如:
alter table 表名 add check (欄位名 <> '');
alter table 表名 add constraint 約束名稱 unique (欄位名);
4、 刪除約束
要刪除一個約束,語法是這樣的:
alter table 表名 drop constraint 約束名;(如果你在處理一個生成的約束名,比如 $2,別忘了你需要給它 新增雙引號,讓它成為一個有效的識別符號。)
和刪除欄位一樣,如果你想刪除有著被依賴關係地約束,你需要用 cascade。 一個例子是某個外來鍵約束依賴被引用欄位上的唯一約束或者主鍵約束。
除了非空約束外,所有約束型別都這麼用。要刪除非空型別,用
alter table 表史 alter column 欄位名 drop not null;(要記得非空約束沒有名字。)
5、改變一個欄位的預設值
要給一個欄位設定預設值,使用一個象下面這樣的命令:
alter table 表名 alter column 欄位名 set default 預設值;
這裡一定要注意這麼做不會影響任何表中現有的資料行, 它只是為將來 insert 命令改變預設值。
同時如果要刪除預設值,用
alter table 表名 alter column 欄位名 drop default;
這樣實際上相當於把預設設定為空。 結果是,如果我們刪除一個還沒有定義的預設值不算錯誤,因為預設隱含就是空值。
6、 修改一個欄位的資料型別,這是我們用得很多的操作。語法是這樣的:
alter table 表名 alter column 欄位名 type 新的型別;
只有在欄位裡現有的每個項都可以用一個隱含的型別轉換轉換城新的型別時才可能成功。也就是說新型別和源始型別必須存在相容的關係,類似於程式語言中的自動轉換時所要求的條件。如果需要更復雜的轉換,你可以增加一個 using 子句,它宣告如何從舊值裡計算新值。
這個方法將試圖把欄位的預設值(如果存在)轉換成新的型別, 還有涉及該欄位的任何約束。但是這些轉換可能失敗,或者可能生成奇怪的結果。 在修改某欄位型別之前,你最好刪除那些約束,然後再把自己手工修改過的新增上去。
7、給欄位改名字
alter table 表名 rename column 源欄位名 to 新欄位名;
8、給表改名字
alter table 表名 rename to 新表名;
有了這些之後,用sql語句操作資料表及結構就更方便了!