我有一个使用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执行此操作的最佳方法是什么?
答案 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中我不相信你可以在一个声明中完成你想要的东西。我认为你需要做的是......
按照问题中的描述创建新表格。
像这样添加AutoNumber列:
ALTER TABLE [new_table] ADD COLUMN [ID] AUTOINCREMENT NOT NULL
将刚刚添加主键的列添加到:
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)