【问题标题】:How to add an integral primary key to a table created with SELECT INTO如何向使用 SELECT INTO 创建的表添加一个完整的主键
【发布时间】:2013-01-10 15:19:42
【问题描述】:

我正在使用 SQL Server 2012,并正在按以下方式创建表:

SELECT x, y
INTO CampRegistration
FROM tableA

UNION

SELECT x, y
FROM tableB

x 和 y 不是主键。我希望CampRegistration 表有一个附加列,它是一个完整的代理主键,即。类似于IDENTITY

如何通过修改SELECT INTO 或之后添加和填充列来做到这一点?

【问题讨论】:

  • 创建一个序列并从中选择。
  • 那么为什么不先创建CampRegistration 表,并在其中添加IDENTITY 列,然后将INSERT 放入其中而不是SELECT INTO?不清楚你为什么要在这里使用SELECT INTO
  • @Pondlife 方便我想。真正的查询有很多列。
  • @CHS 但是你多久这样做一次,提前知道你的表结构是一个负担?
  • @Aaron 我不反对。我只是注意到,在这种给定的情况下,我不知道如何将新的 PK 列填充到现有表中,并且想知道如何去做。

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

其他答案会添加行号,但不要将其设为键,并且在您想添加新注册时也无济于事。以下是在您运行 SELECT INTO 后,您可以添加一个 IDENTITY 列并将其作为键的方法:

ALTER TABLE dbo.CampRegistration
  ADD RegistrationID INT IDENTITY(1,1);

ALTER TABLE dbo.CampRegistration 
  ADD CONSTRAINT PK_CampRegistration
  PRIMARY KEY (RegistrationID);

【讨论】:

    【解决方案2】:

    您可以使用IDENTITY function 直接添加具有IDENTITY 属性的列。

    ;WITH T
         AS (SELECT x,
                    y
             FROM   tableA
             UNION
             SELECT x,
                    y
             FROM   tableB)
    SELECT IDENTITY(INT, 1, 1) AS Id,
           x,
           y
    INTO   CampRegistration
    FROM   T 
    

    之后您仍然需要添加 PK 约束,但这会在堆转换为聚集索引时添加额外的不必要的排序操作。最有效的方法是CREATE table

    SELECT TOP (0) IDENTITY(INT, 1, 1) AS Id,
                   x,
                   y
    INTO   CampRegistration
    FROM   tableA 
    

    然后在表还是空的时候添加聚簇主键。

    然后插入到表中。 SQL Server 意识到IDENTITY 将按聚集索引顺序排列,并且不会对它们进行排序。

    【讨论】:

      【解决方案3】:

      使用窗口函数动态创建列。

      SELECT Row_Number() Over (Order By x,y) As ID, x, y
      INTO CampRegistration
      FROM tableA
      

      【讨论】:

        【解决方案4】:

        由于您有一个 UNION,您需要使用 CTE 或内联视图。

        例如

        SELECT Row_Number() Over (order by x,y) rn, x,y
        INTO CampRegistration
        FROM
        (
        SELECT x, y
        FROM tableA
        UNION
        SELECT x, y
        FROM tableB
        ) as t
        

        【讨论】:

          【解决方案5】:

          ROW_NUMBER()怎么样

          SELECT x, y, ROW_NUMBER()
          INTO CampRegistration
          ....
          

          【讨论】:

          • ROW_NUMBER 需要一个 over 子句,编号如何在联合中起作用?
          猜你喜欢
          • 2013-03-08
          • 2017-09-24
          • 1970-01-01
          • 2021-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-21
          • 1970-01-01
          相关资源
          最近更新 更多