2011-10-12 234 views
2

CREATE TABLE AS SELECT PostgreSQL中的語句不會創建具有原始表的NOT NULL約束的列的新表。PostgreSQL中的CREATE TABLE AS SELECT

我的表格tab1的col1和col2不是null約束。

create table tab1 (col1 varchar(23) not null, col2 int not null)

,現在我創造與定義,如下表TAB2的數據的新表TAB2:

創建TAB1表TAB2作爲選擇COL1,COL2

但是,tab2的col1和col2沒有NOT NULL約束。如何在原始表的新表列中獲得確切的NOT NULL約束狀態?

如果有什麼辦法可以使用CREATE TABLE AS SELECT來達到這個目的,非常感謝。 Oracle中的CREATE TABLE AS SELECT語句,SQLServer中的DB2和SELECT .. INTO將NOT NULL CONSTRAINT與數據一起復制。

+1

[創建表作爲select可能會在postgresql中刪除非空約束](http://stackoverflow.com/questions/7738691/creating-table-as-select-is-droping-the-not-null -constraints-in-postgresql) –

+0

1小時前已經提出了同樣的問題。順便說一句:在Oracle中,'CREATE TABLES AS SELECT'也不會複製約束條件。 –

+0

@a_horse_with_no_name我剛剛在Oracle中進行了測試,它完全將NOT NULL約束複製到父表的新表的列中。從類似的線程,我可以使用INCLUDE cluase複製約束,但我如何使用這個,如果我想從查詢創建一個新的表,如UNION ALL等如下所示:CREATE TABLE tab3 AS SELECT * FROM TAB1 UNION所有SELECT * FROM TAB2'這是我的實際需求。 – vchitta

回答

4

的PostgreSQL的功能,你正在尋找is in

CREATE TABLE tablename 
(LIKE parent_table INCLUDING CONSTRAINTS) /* other options too */ 

CREATE TABLE AS,據我所知,可以完全隨意SELECT使用,PG不檢查,如果這僅涉及一個表,更不用說嘗試推斷限制。