使用 SELECT INTO 创建一个新表并添加一个主键
Posted
技术标签:
【中文标题】使用 SELECT INTO 创建一个新表并添加一个主键【英文标题】:Create a new table and adding a primary key using SELECT INTO 【发布时间】:2013-03-08 16:27:23 【问题描述】:我有一个使用 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 执行此操作的最佳方法是什么?
【问题讨论】:
从两个表中选择 * 会自动返回连接字段两次。仅使用您需要的字段进行尝试。 我需要在结果表中使用内部自动递增 PK 问得好,我希望能够做同样的事情。 【参考方案1】:据我所知,在INSERT INTO
语句中添加Primary Key
是不可能的。但是,您可以添加一个 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)
【讨论】:
一定有办法让它成为主键。? @user559142 此函数在 SS2008 及更高版本中可用,但 SQL Azure 不可用(还没有?)。 @user559142 从今天开始的主键可以添加为 ALTER TABLE 语句。 这不是对 OP 问题的有效答案。他特意说数据库在Access中,而Access没有Identity功能。 SQL Server 和 Azure 数据库(不是仓库)可以,但 Access 不会,它会返回 OP 在他对此回复的第二条评论中引用的未定义错误。 真棒选项内联 IDENTITY。与“SELECT.. INTO ...”完美搭配,正是我所需要的!!之后添加 'ALTER TABLE [xxx] ADD CONSTRAINT xxxx_PK PRIMARY KEY (ID)【参考方案2】:在 Access 中,我不相信您可以在一个语句中完成您想要的。我认为你需要做的是......
按照问题中的描述创建新表。
像这样添加自动编号列:
ALTER TABLE [new_table] 添加列 [ID] AUTOINCREMENT NOT NULL
将刚刚添加的列设为主键:
ALTER TABLE [new_table] 添加约束 NewTable_PK 主键 (ID)
【讨论】:
【参考方案3】:创建主键和插入同时需要什么?
您可以同时创建主键和表,但据我所知不能插入。 你可以这样做。
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)
这消除了插入所有内容的需要,只需成为您想要的列。
【讨论】:
您可能会受到限制,因为这是在 SQL Management Studio 中完成的。您可能可以摆脱身份,但我假设不是约束部分。以上是关于使用 SELECT INTO 创建一个新表并添加一个主键的主要内容,如果未能解决你的问题,请参考以下文章
运行 Select-into 命令为特定列的每个 UNIQUE 值创建一个新表
postgresql/lightdb中对应ctas的select into
mysql中select into 和sql中的select into 对比