2011-05-24 78 views
5

我正在使用SQL Server 2008,并且我正在使用的数据库表的主键不是IDENTITY列(不知道为什么)。我需要改变这一点。如何将auto_increment添加到SQL Server 2008中的列中

我在设计视图中的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 
+0

你说的意思不能改变它。它会给你一个错误?它变灰了吗? – 2011-05-24 16:44:08

+0

这个问题是身份是灰色到否,我不能改变它 – Trace 2011-05-24 17:03:27

+0

在一个侧面说明:我会*不会*调用像'[日期时间]'的列'我也会推荐*而不是*长度小于5的列'varchar'或'nvarchar' - 2字节的开销只会让你失望。如果列为5个字符或更少,则使用'CHAR(x)'或'NCHAR(x)'。我相信你现在正在增加'Trans_ID'的方法在繁忙的环境中不安全,并且迟早会导致重复'Trans_ID'值... – 2011-05-24 19:01:52

回答

5

您需要查询展开“标识规范”节点以通过(Is Identity)属性更改它。

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

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

+0

+1这有点棘手,起初不太直观 - 只需点击“身份规范”行就不会做任何事情 - 必须首先展开它,然后才能进行更改... – 2011-05-24 16:45:40

+0

这个问题是身份是灰色到否,我不能改变它 – Trace 2011-05-24 17:03:09

+0

@Tamer - 什么是列的数据类型? – 2011-05-24 17:08:17

1

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

  • 删除主键约束和任何引用表中的问题列的外键约束。
  • 使用identity属性添加一个新列。它应该有相同的类型(我假设为int)作为现有的列。
  • 更新表以使用现有列的值为新列生成种子。
  • 更改新列以使其不可空。
  • 删除旧的/现有的列。
  • 重命名新列,以使其名称与旧列的名称相同。
  • 重新创建在第1步中丢弃的主键和外键引用。

简单!或者其他的东西。

+1

[有一种方法可以做为元数据变更](http://stackoverflow.com/questions/5181304/set-identity-on-the-column/6094907#6094907)(顺便说一下'身份证号码栏不是可更新,因此步骤3无法在您的计划中完成) – 2011-05-24 16:52:25

+0

@Martin标识列实际上可以在使用Set Identity_insert ON转换过程中更新ON – HLGEM 2011-05-24 18:46:08

+1

'set identity_insert on'允许**插入行身份专栏中的价值;它不允许对现有行的标识列的值进行**更新**。 – 2011-05-24 18:49:19

11

为了说明马丁的观点:

enter image description here

而且PS: - 为的Mikael埃里克森理所当然地提到(和文件很好),这标识规范仍然只要变灰该列你”重新工作有一个默认约束。

+0

这个问题是身份是灰色到否,我不能改变它 – Trace 2011-05-24 17:06:58

+2

准确地说我的观点:你不能添加身份属性后的事实。如果不放下色谱柱,也无法摆脱它。在创建列时,必须定义identy属性**。因此,我在下面的答案中是7步探戈。 – 2011-05-24 18:10:38

5

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

这是您的表AR_Transactions中列Trans_ID的属性。 (Is Identity)被禁用:

enter image description here

删除默认的约束和(Is Identity)不再禁用:

enter image description here

设置为yes并且保存。 Default Value or Binding改为禁用:

enter image description here

+2

+1钉在头上 - 不知道为什么有人会** downvote **这个绝对的现货回应..... – 2011-05-24 20:36:21

+0

+1这似乎解释的东西! – 2011-05-24 20:58:33

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] 
相关问题