17

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

4

3 回答 3

17

Adding a Primary Key during a INSERT INTO statement is not possible as far as I'm aware. What you can do however, is add an IDENTITY column that auto increments by using SQL Server's IDENTITY() function.

Something like this:

SELECT 
    ID = IDENTITY(INT, 1, 1),
    col1,
    col2
INTO new_table 
FROM (SELECT * FROM table a, table b WHERE a.name = b.name)
于 2013-03-19T19:52:21.073 回答
8

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

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

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

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

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

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

于 2013-03-19T21:43:23.450 回答
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)

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

insert into table (col1, col2)

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

于 2013-03-19T19:49:37.297 回答