使用 SELECT INTO 创建一个新表并添加一个主键

Posted

技术标签:

【中文标题】使用 SELECT INTO 创建一个新表并添加一个主键【英文标题】:Create a new table and adding a primary key using SELECT INTO 【发布时间】:2013-03-08 16:27:23 【问题描述】:

我有一个使用 SELECT INTO SQL 语法创建的数据库表。该数据库位于 Access 中,包含大约 500,000 行。问题是当我进行连接时,唯一的是整行 - 我想要一个自动编号 ID 字段作为主键。

我目前拥有的代码类似于:

SELECT INTO new_table
FROM 
(SELECT * FROM table a, table b WHERE a.name = b.name)

我希望有一种方法可以在我的 SELECT INTO 查询中添加一个子句,这样我就可以添加一个主键并一次性创建表 - 这可能吗?

如果不是,那么仅使用 SQL 执行此操作的最佳方法是什么?

【问题讨论】:

从两个表中选择 * 会自动返回连接字段两次。仅使用您需要的字段进行尝试。 我需要在结果表中使用内部自动递增 PK 问得好,我希望能够做同样的事情。 【参考方案1】:

据我所知,在INSERT INTO 语句中添加Primary Key 是不可能的。但是,您可以添加一个 IDENTITY 列,该列使用 SQL Server 的 IDENTITY() 函数自动递增。

类似这样的:

SELECT 
    ID = IDENTITY(INT, 1, 1),
    col1,
    col2
INTO new_table 
FROM (SELECT * FROM table a, table b WHERE a.name = b.name)

【讨论】:

一定有办法让它成为主键。? @user559142 此函数在 SS2008 及更高版本中可用,但 SQL Azure 不可用(还没有?)。 @user559142 从今天开始的主键可以添加为 ALTER TABLE 语句。 这不是对 OP 问题的有效答案。他特意说数据库在Access中,而Access没有Identity功能。 SQL Server 和 Azure 数据库(不是仓库)可以,但 Access 不会,它会返回 OP 在他对此回复的第二条评论中引用的未定义错误。 真棒选项内联 IDENTITY。与“SELECT.. INTO ...”完美搭配,正是我所需要的!!之后添加 'ALTER TABLE [xxx] ADD CONSTRAINT xxxx_PK PRIMARY KEY (ID)【参考方案2】:

在 Access 中,我不相信您可以在一个语句中完成您想要的。我认为你需要做的是......

    按照问题中的描述创建新表。

    像这样添加自动编号列:

    ALTER TABLE [new_table] 添加列 [ID] AUTOINCREMENT NOT NULL

    将刚刚添加的列设为主键:

    ALTER TABLE [new_table] 添加约束 NewTable_PK 主键 (ID)

【讨论】:

【参考方案3】:

创建主键和插入同时需要什么?

您可以同时创建主键和表,但据我所知不能插入。 你可以这样做。

create table Tester 
(
Id int identity
    constraint PK_Id primary key(Id),
    description varchar(256)
)


insert into Tester
Select description
from table

如果您想确保该表尚不存在并大量运行此脚本,也可以添加一个 drop 并创建。临时表 '#(something)' 可以遵循永久表的许多规则,除了用于代码级别的移动和完成后的清理。

if object_id('(schema).(tablename)') is not null 
   drop table (schema).(tablename)

我创造了一个不断增加的“身份”种子。默认是从 1 开始并以 1 递增,这满足了 95% 的简单数据库主键需求。它会自动增加,因此您无需担心。如果你有更多类似的东西,你也可以只插入特定的值:

insert into table (col1, col2)

这消除了插入所有内容的需要,只需成为您想要的列。

【讨论】:

您可能会受到限制,因为这是在 SQL Management Studio 中完成的。您可能可以摆脱身份,但我假设不是约束部分。

以上是关于使用 SELECT INTO 创建一个新表并添加一个主键的主要内容,如果未能解决你的问题,请参考以下文章

运行 Select-into 命令为特定列的每个 UNIQUE 值创建一个新表

postgresql/lightdb中对应ctas的select into

mysql中select into 和sql中的select into 对比

SQL SELECT INTO 语句

MySQL select into 和 SQL select into

select into from 和 insert into select的使用