【问题标题】:CREATE TABLE AS SELECT in PostgreSQL在 PostgreSQL 中创建表作为选择
【发布时间】: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


【解决方案1】:

PostgreSQL中你正在寻找的功能is in

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 2013-07-17
    • 2018-06-18
    相关资源
    最近更新 更多