用主键创建一个“ INTO”表


8

也许对于这个社区来说,我的问题很容易,但是对我(一个简单的Java程序员)来说,这是一个大问题。

我有一个越来越多的数据的大数据库。因此,外部数据库管理员创建了一个作业,该作业在临时表中向我显示所需的数据。但是他创建的表没有主键,当我的java项目去读取该表时,出现错误。

我无法读取此表,因为主键不存在。

我可以在不更改此复杂过程结构的情况下在过程中插入创建自动增量主键的可能性吗?

这是存储过程代码的开头:

USE [MYDB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER Procedure [dbo].[spSchedula_Scadenzario]
as
begin

    drop table MYDB.dbo.tmpTable


 select 
  aa.*
    into MYDB.dbo.tmpTable 
from (...)

提前致谢

Answers:


5

听起来您正在寻找IDENTITY()函数:

仅在带有INTO table子句的SELECT语句中用于将标识列插入新表中。

USE [MYDB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER Procedure [dbo].[spSchedula_Scadenzario]
as
begin

    drop table MYDB.dbo.tmpTable


     select 
    -- Create new identity here.
    NewPrimaryKey = IDENTITY(int, 1, 1),
    aa.*
    into MYDB.dbo.tmpTable 
from (...)

14
@Paola尽管需要明确,但这仅解决了问题的自动递增部分。该表仍然没有主键。
马丁·史密斯

9

IDENTITY()通过@Shaneis建议的通过函数添加自动增量列的一些替代方法是:

  1. 使用CREATE TABLE而不是使用显式创建表SELECT INTO。我更喜欢这种方法,因为它可以让您完全控制要创建的表,例如包括自动增量列指定它为主键。例如:

    CREATE TABLE dbo.tmpTable
    (
      tmpTableID INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
      ...
      {all columns represented by aa.* in the sample query in the Question}
    );
    
  2. 如果你不能改变如何/在哪里被创建表时/,以后可以随时添加一列,而这样做的时候,你被允许同时指定,它是一个IDENTITY,并有主键就可以创建。例如:

    ALTER TABLE [dbo].[tmpTable]
      ADD [tmpTableID] INT NOT NULL
      IDENTITY(1, 1)
      PRIMARY KEY;
    

    如果表中已经有数据,这甚至可以工作:IDENTITY将从为seed参数指定的值开始,按预期填充新列。但是,无法控制分配值的顺序(如果可能的话,这是选择选项#1的几个原因之一)。

补充笔记:

  • 您确定需要主键,而不仅仅是自动递增/唯一列吗?虽然拥有主键通常是一个好主意,但它既不是必需的,也不是与自动增量列相同的东西。我之所以这样问,是因为该问题的标题和文本都说明您需要主键,但是您在“答案”的注释中说,您接受了使自动增量列起作用的事实。

  • 您正在使用的表实际上不是临时表。实际临时表的名称以#或开头,##表示全局临时表。您使用的表dbo.tmpTable只是一个常规的永久性表,前缀为“ tmp”以表明它可能仅用于此过程,而不是数据模型的一部分。

    如果应用程序代码不需要访问此“临时”表,并且对其的唯一引用是在此存储过程中,则您可以考虑将其更改为真正的临时表,其优点是可以在清除时该过程完成,在这种情况下,您不需要该DROP TABLE语句。

  • 如果要使用永久表而不是临时表(在这种情况下,您需要自己清理),则该DROP TABLE语句应该是有条件的,这样,如果表不存在,则不会出错:

    IF (OBJECT_ID(N'dbo.tmpTable') IS NOT NULL)
    BEGIN
       DROP TABLE dbo.tmpTable;
    END;
    
  • 而不是这样做SELECT *,您应该指定完整的列列表。*当您向表或子查询中添加列/字段时(aa使用别名),使用会使过程更容易中断。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.