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

时间:2013-03-19 19:42:09

标签: 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)

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

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

4 个答案:

答案 0 :(得分:13)

据我所知,在Primary Key语句中添加INSERT INTO是不可能的。但是,您可以添加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)

答案 1 :(得分:2)

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

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

  2. 像这样添加AutoNumber列:

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

  3. 将刚刚添加主键的列添加到:

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

答案 2 :(得分: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)

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

答案 3 :(得分:0)

从SQL 2012开始,有一个DateFromParts函数-我认为这更具可读性:

DATEFROMPARTS(YEAR(<datefield>), MONTH(s.DateEnded), 1)