【问题标题】:CREATE TABLE AS with PRIMARY KEY in one statement (PostgreSQL)在一个语句中使用 PRIMARY KEY 创建 TABLE AS (PostgreSQL)
【发布时间】:2012-06-25 22:39:21
【问题描述】:

有没有办法在单个“CREATE TABLE AS”语句中设置主键?

示例 - 我希望将以下内容写入 1 个语句而不是 2 个语句:

 CREATE TABLE "new_table_name" AS SELECT a.uniquekey, a.some_value + b.some_value FROM "table_a" AS a, "table_b" AS b WHERE a.uniquekey=b.uniquekey;
 ALTER TABLE "new_table_name" ADD PRIMARY KEY (uniquekey);

一般来说有没有更好的方法(假设有超过 2 个表,例如 10 个)?

【问题讨论】:

    标签: postgresql primary-key create-table


    【解决方案1】:

    请参见下面的命令,它将创建一个包含所有约束且没有数据的新表。在 postgres 9.5 中工作

    CREATE TABLE IF NOT EXISTS <ClonedTableName>(like <OriginalTableName> including all)
    

    【讨论】:

      【解决方案2】:

      在 mysql 中,两者都可以在一个命令中实现

      命令是

      create table new_tbl (PRIMARY KEY(`id`)) as select * from old_tbl;
      

      id 是主键为 old_tbl 的列

      完成...

      【讨论】:

      • 投反对票,因为这是 mysql 语法,而不是 postgres(根据问题)。在 postgres 中是不可能的。
      • 好吧,在发布问题的同时,我在 mysql 中遇到了完全相同的问题,我自己用这个命令解决了这个问题,所以我认为这对我的朋友可能有用。(除了我不允许尚未发表评论,并认为 Postgre SQL 的 SQL 语法将相同,所以我将其发布为答案)无论如何感谢您扩展我对 postgre sql 的知识......
      • 投票赞成,即使这不是对我有用的问题;)
      【解决方案3】:

      你可以这样做

      CREATE TABLE IOT (EMPID,ID,Name, CONSTRAINT PK PRIMARY KEY( ID,EMPID)) 
       ORGANIZATION INDEX NOLOGGING COMPRESS 1 PARALLEL 4
      AS SELECT 1 as empid,2 id,'XYZ' Name FROM dual;
      

      【讨论】:

      • 这对 Postgres 无效
      • 看起来像 Oracle 语法
      【解决方案4】:

      如果您想创建一个与另一个表具有相同表结构的新表,您可以在一个语句中执行此操作(创建新表和设置主键),如下所示:

      create table mytable_clone (like mytable including defaults including constraints including indexes);
      

      【讨论】:

        【解决方案5】:

        根据手册:create tablecreate table as 您可以:

        • 先用主键创建表,稍后再使用select into
        • 先创建表,稍后使用添加主键

        但不是两者都 create table as with primary key - 你想要的。

        【讨论】:

        • 在这两个选项中,数据加载后创建主键(及其关联索引)可能会更快。
        【解决方案6】:

        不,没有更短的方法来创建表和主键。

        【讨论】:

          猜你喜欢
          • 2016-07-05
          • 2022-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-20
          • 2018-06-06
          • 2021-01-08
          • 2022-01-07
          相关资源
          最近更新 更多