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

use*_*142 12 sql database ms-access dataset

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

我目前的代码是这样的:

SELECT INTO new_table
FROM 
(SELECT * FROM table a, table b WHERE a.name = b.name)
Run Code Online (Sandbox Code Playgroud)

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

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

Jod*_*dyT 14

据我所知,Primary KeyINSERT INTO语句中添加a 是不可能的.但是,您可以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)
Run Code Online (Sandbox Code Playgroud)

  • 必须有办法使这成为主键. (2认同)
  • 这不是对OP问题的有效答案。他特意说数据库是在Access中的,而Access没有Identity功能。SQL Server 和 Azure 数据库(不是仓库)会这样做,但 Access 不会,并且它将返回 OP 在对此回复的第二条评论中引用的未定义错误。 (2认同)

Gor*_*son 5

在Access中,我不相信您可以在单个语句中完成所需的操作。我认为您需要做的是...

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

  2. 像这样添加“自动编号”列:

    ALTER TABLE [new_table]添加列[ID] AUTOINCREMENT不为NULL

  3. 使您刚刚添加的列成为主键:

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


dja*_*azz 0

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

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

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


insert into Tester
Select description
from table
Run Code Online (Sandbox Code Playgroud)

或者如果您想确保该表尚不存在并多次运行此脚本,则添加一个删除并创建。临时表“#(something)”可以遵循永久表的许多规则,除了用于代码级移动以及完成后的清理之外。

if object_id('(schema).(tablename)') is not null 
   drop table (schema).(tablename)
Run Code Online (Sandbox Code Playgroud)

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

insert into table (col1, col2)
Run Code Online (Sandbox Code Playgroud)

这样就无需插入所有内容,只需插入您想要的列即可。