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

19

我有一个使用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的最佳方法是什么?


从两个表中选择*会自动返回连接字段两次。请只使用您需要的字段进行尝试。 - Dan Bracuk
我需要在结果表中一个内部自增的主键。 - user559142
很棒的问题,我很想能够做同样的事情。 - jhilden
3个回答

17

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

像这样:

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

2
一定有办法将其设为主键吧? - user559142
@user559142 这个函数在SS2008及以后版本中可用,但在SQL Azure中不可用(还没有?)。 - Gert Arnold
@user559142 主键可以通过ALTER TABLE语句添加。 - user482745
2
这不是对OP问题的有效回答。他明确表示数据库在Access中,而Access没有Identity函数。SQL Server和Azure数据库(不是数据仓库)有,但Access没有,它将返回OP在此回复的第二个评论中引用的Undefined错误。 - DaveInAZ
1
内联IDENTITY选项非常棒。与“SELECT.. INTO…”完美配合,正是我所需要的!之后添加“ALTER TABLE [xxx] ADD CONSTRAINT xxxx_PK PRIMARY KEY (ID)” - fcm

9
在Access中,我认为您无法通过一条语句完成您想要的操作。我认为您需要做以下几步:
  1. 按照问题描述创建新表。
  2. 像这样添加自动编号列:

    ALTER TABLE [new_table] ADD COLUMN [ID] AUTOINCREMENT NOT NULL

  3. 将刚刚添加的列设置为主键:

    ALTER TABLE [new_table] ADD CONSTRAINT NewTable_PK PRIMARY KEY (ID)


0

创建主键并同时插入的必要性是什么?

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

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)

我使用“identity”创建了一个不断增长的种子。默认情况下,从1开始递增1,这可以满足95%的简单数据库主键需求。它会自动递增,所以您不需要担心它。如果您有更多类似的特定值,也可以插入到其中。

insert into table (col1, col2)

这样可以避免插入所有内容,只选择你想要的列。

你可能会受到限制,因为这是在SQL Management Studio中完成的。你可能可以使用identity,但我假设不能使用constraint部分。 - djangojazz

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