2011-05-24 76 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] 
相關問題