在一条语句中使用主键创建表(PostgreSQL)

71

有没有一种方法可以在单个 "CREATE TABLE AS" 语句中设置主键?

例如 - 我想将以下内容写入一个语句而不是两个:

 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个)?

6个回答

76
根据手册:create tablecreate table as 你可以选择以下两种方式之一:
  • 先使用带有主键的create table,然后再使用select into
  • 先使用create table as,然后再使用add primary key

但是不可使用create table asprimary key两者结合的方式,这是你想要的。


20
在这两种选择中,先加载数据再创建主键(及其相关索引)可能会更快。 - kgrittn

25
如果您想要创建一个与另一个表具有相同表结构的新表,您可以使用以下语句(同时创建新表并设置主键)来完成:
CREATE TABLE mytable_clone (
   LIKE mytable 
     INCLUDING defaults
     INCLUDING constraints
     INCLUDING indexes
);

1
看下面的命令,它会创建一个新表,包含所有约束条件但不包含数据。在postgres 9.5中有效。
CREATE TABLE IF NOT EXISTS <ClonedTableName>(like <OriginalTableName> including all)

0

在MySQL中,可以使用一个命令同时实现两种操作。

该命令为:

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

其中id是旧表的主键列

完成...


4
因为这是 MySQL 语法,而不是 PostgreSQL(根据问题),所以被点了踩。并且在 PostgreSQL 中不能实现。 - erikreed
6
我在MySQL中遇到了与问题发帖时相同的问题,但我自己用这个命令解决了它。所以我认为这可能对我的朋友有用。(此外,我还没有被允许评论,而且认为PostgreSQL的SQL语法应该是相同的,所以我把这个作为答案发布了)不管怎样,感谢你扩展了我的关于PostgreSQL的知识... - kaushikC
4
即使不是问题,您的回答对我很有帮助,我会点赞的。 - karen

0

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


-6

你可以这样做

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;

1
这对于Postgres是无效的。 - user330315
2
看起来像是Oracle语法。 - Gary - Stand with Ukraine

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