【问题标题】:Create a new table and adding a primary key using SELECT INTO使用 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
  • 问得好,我希望能够做同样的事情。

标签: sql database ms-access dataset


【解决方案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 中,我不相信您可以在一个语句中完成您想要的。我认为你需要做的是......

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

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

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

  3. 将刚刚添加的列设为主键:

    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 中完成的。您可能可以摆脱身份,但我假设不是约束部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2021-12-22
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多