在PostgreSQL中使用CREATE TABLE AS SELECT

3
在PostgreSQL中,CREATE TABLE AS SELECT语句不会创建一个新表并将原表的列及其NOT NULL约束条件复制到新表中。
我的表tab1有col1和col2两列,它们都有not null约束条件。
create table tab1 (col1 varchar(23) not null, col2 int not null)
现在我想要创建一个新表tab2,并使用以下命令将表tab1的定义和数据复制到表tab2中:
create table tab2 as select col1,col2 from tab1
但是,表tab2中的col1和col2没有NOT NULL约束条件。如何让新表的列与原表完全相同,包括NOT NULL约束条件呢?
如果可以使用CREATE TABLE AS SELECT语句实现这一点,那将非常感激。在Oracle、DB2和SQLServer中,CREATE TABLE AS SELECT语句和SELECT .. INTO语句都可以将NOT NULL CONSTRAINT与数据一起复制。

相同的问题在1小时前已经被问过了。顺便说一下:在Oracle中,“CREATE TABLES AS SELECT”也不会复制约束。 - user330315
@a_horse_with_no_name 我刚在Oracle中进行了测试,它完美地将NOT NULL约束复制到新表的列中,就像父表一样。从类似的线程中,我可以使用INCLUDE子句来复制约束,但如果我必须从具有UNION ALL等的查询创建新表,该怎么办?像下面这样:CREATE TABLE tab3 AS SELECT * FROM TAB1 UNION ALL SELECT * FROM TAB2 这是我实际的要求。 - vchitta
@vchitta,我不明白你想要什么样的规范。假设TAB1的第一列有一个“NOT NULL”约束,但是TAB2没有,甚至其中有NULL值?!您可以通过使用“CREATE TABLE ...(LIKE ...)”和“INSERT”的组合来获得所需的内容吗? - Andrew Lazarus
1个回答

8
PostgreSQL中,您要寻找的功能在此处
CREATE TABLE tablename 
(LIKE parent_table INCLUDING CONSTRAINTS) /* other options too */ 

据我所知,CREATE TABLE AS可以与完全任意的SELECT一起使用,而且PG不会检查这是否只涉及一个表,更不会试图推断约束条件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接