【发布时间】:2011-10-12 11:41:39
【问题描述】:
PostgreSQL 中的CREATE TABLE AS SELECT 语句未使用具有原始表的NOT NULL 约束的列创建新表。
我的表 tab1 的 col1 和 col2 具有非空约束。
create table tab1 (col1 varchar(23) not null, col2 int not null)
现在我正在创建一个新表 tab2,其中表 tab2 的定义和数据如下:
create table tab2 as select col1,col2 from tab1
但是 tab2 的 col1 和 col2 没有 NOT NULL 约束。如何在原始表的新表列中获得确切的 NOT NULL 约束状态?
如果有任何方法可以使用CREATE TABLE AS SELECT 语句来实现这一点,我们将不胜感激。 Oracle、DB2 中的 CREATE TABLE AS SELECT 语句和 SQLServer 中的 SELECT .. INTO 将 NOT NULL CONSTRAINT 与数据一起复制。
【问题讨论】:
-
1 小时前也有人问过同样的问题。顺便说一句:在 Oracle 中,“CREATE TABLES AS SELECT”也不会复制约束。
-
@a_horse_with_no_name 我刚刚在 Oracle 中进行了测试,它完美地将 NOT NULL 约束复制到父表的新表列。从类似的线程中,我可以使用 INCLUDE cluase 来复制约束,但是如果我从查询中创建一个新表,如 UNION ALL 等,我该如何使用它,如下所示:
CREATE TABLE tab3 AS SELECT * FROM TAB1 UNION ALL SELECT * FROM TAB2这是我的实际要求. -
@vchitta,我不明白你想要什么样的规格。假设 TAB1 的第一列有
NOT NULL约束,但 TAB2 没有,甚至其中有 NULL 值?!CREATE TABLE ... (LIKE ...)和INSERT的组合你能得到你想要的吗?
标签: postgresql