如何将自动增量添加到SQL Server 2008中的列

时间:2011-05-24 16:40:47

标签: sql sql-server-2008 auto-increment

我正在使用SQL Server 2008,而我使用的数据库表的主键不是IDENTITY列(不确定原因)。我需要改变它。

我在设计视图中的SQL Server Management Studio中,在列属性下,由于某种原因,我无法将标识规范更改为Yes

是否有一些我缺少的东西..我是SQL Server的新手 - 关于我所缺少的任何想法?

这是创建表

CREATE TABLE [dbo].[AR_Transactions](
       [Trans_ID] [bigint] NOT NULL,
       [DateTime] [datetime] NOT NULL,
       [Cashier_ID] [nvarchar](50) NULL,
       [CustNum] [nvarchar](12) NOT NULL,
       [Trans_Type] [nvarchar](2) NOT NULL,
       [Prev_Cust_Balance] [money] NULL,
       [Prev_Inv_Balance] [money] NULL,
       [Trans_Amount] [money] NOT NULL,
       [Payment_Method] [nvarchar](4) NULL,
       [Payment_Info] [nvarchar](20) NULL,
       [Description] [nvarchar](38) NULL,
       [Invoice_Number] [bigint] NOT NULL,
       [Store_ID] [nvarchar](10) NOT NULL,
       [Dirty] [bit] NOT NULL,
       [Station_ID] [nvarchar](5) NULL,
       [Payment_Type] [smallint] NULL,

CONSTRAINT [pkAR_Transactions] 
       PRIMARY KEY CLUSTERED([Store_ID] ASC, [Trans_ID] ASC)
           WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
                 ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

ALTER TABLE [dbo].[AR_Transactions] 
    ADD CONSTRAINT [DF_AR_Transactions_Trans_ID_AR_Transactions] 
    DEFAULT ((0)) FOR [Trans_ID]

ALTER TABLE [dbo].[AR_Transactions] 
    ADD CONSTRAINT [DF_AR_Transactions_Invoice_Number_AR_Transactions] 
    DEFAULT ((0)) FOR [Invoice_Number]

以下是我需要运行的查询...这是一个完全自我试图自动增加插入的黑客

BEGIN TRANSACTION 

INSERT INTO 
        [cresql].[dbo].[AR_Transactions](Trans_ID, DateTime , Dirty, Store_ID, Trans_Type,  
            Cashier_ID, CustNum, Trans_Amount, Prev_Cust_Balance) 
        SELECT  
            (SELECT MAX(Trans_ID ) + 1 FROM [cresql].[dbo].[AR_Transactions]), 
            DATEADD(MINUTE, -30, Getdate()), 1, 1001, 'C', 100199, CustNum,
            -Acct_Balance, Acct_Balance 
    FROM  [cresql].[dbo].[Customer] 
        WHERE Acct_Balance <> 0  

UPDATE [cresql].[dbo].[Customer] 
    SET Acct_Balance = 0 
WHERE Acct_Balance <> 0  

COMMIT TRANSACTION

5 个答案:

答案 0 :(得分:13)

说明马丁的观点:

enter image description here

并且 PS: - 正如Mikael Eriksson正确地提到的那样(并且很好地记录了文档),只要你正在处理的那个列有一个身份规范,它就会变灰。默认约束。

答案 1 :(得分:5)

您需要展开“身份规范”节点,以通过(Is Identity)属性更改它。

这将重建表格,因此您可能还需要进入Tools -> Options -> Designers -> Prevent saving changes that require table re-creation

这对于大型表来说可能是非常耗时的操作,并且需要大量的日志记录和锁定。在大型表see my answer here上执行此操作。

答案 2 :(得分:5)

首先删除列Trans_ID的默认约束。然后,您可以在设计器中将Is Identity设置为是。

这是表AR_Transactions中列Trans_ID的属性。 (Is Identity)已停用:

enter image description here

删除默认约束,不再禁用(Is Identity)

enter image description here

设置为是并保存。 {}禁用Default Value or Binding

enter image description here

答案 3 :(得分:1)

您不能使用ALTER TABLE ... ALTER COLUMN修改列以具有标识属性。你需要

  • 删除主键约束和引用表中相关列的任何外键约束。
  • 添加一个包含identity属性的新列。它应该与现有列具有相同的类型(int,我认为)。
  • 更新表格,使用现有列的值为新列播种。
  • 更改新列以使其不可为空。
  • 删除旧/现有列。
  • 重命名新列,使其名称与旧列的名称相同。
  • 重新创建在第1步中删除的主键和外键引用。

简单!或者其他什么。

答案 4 :(得分:0)

CREATE TABLE [dbo].[AR_Transactions](
       [Trans_ID] [bigint] IDENTITY(1,1) NOT NULL,
       [DateTime] [datetime] NOT NULL,
       [Cashier_ID] [nvarchar](50) NULL,
       [CustNum] [nvarchar](12) NOT NULL,
       [Trans_Type] [nvarchar](2) NOT NULL,
       [Prev_Cust_Balance] [money] NULL,
       [Prev_Inv_Balance] [money] NULL,
       [Trans_Amount] [money] NOT NULL,
       [Payment_Method] [nvarchar](4) NULL,
       [Payment_Info] [nvarchar](20) NULL,
       [Description] [nvarchar](38) NULL,
       [Invoice_Number] [bigint] NOT NULL,
       [Store_ID] [nvarchar](10) NOT NULL,
       [Dirty] [bit] NOT NULL,
       [Station_ID] [nvarchar](5) NULL,
       [Payment_Type] [smallint] NULL,

CONSTRAINT [pkAR_Transactions] 
       PRIMARY KEY CLUSTERED([Store_ID] ASC, [Trans_ID] ASC)
           WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
                 ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

ALTER TABLE [dbo].[AR_Transactions] 
    ADD CONSTRAINT [DF_AR_Transactions_Trans_ID_AR_Transactions] 
    DEFAULT ((0)) FOR [Trans_ID]

ALTER TABLE [dbo].[AR_Transactions] 
    ADD CONSTRAINT [DF_AR_Transactions_Invoice_Number_AR_Transactions] 
    DEFAULT ((0)) FOR [Invoice_Number]