2013-04-24 10 views
7

ho creato una tabella in SQL Server in questo modo:Come impostare colonna di identità di tabella creata in SQL Server

CREATE TABLE [UserName] 
(
    [ID] [int] NOT NULL , 
    [Name] [nvarchar] (50) NOT NULL , 
    [Address] [nvarchar] (200) NULL 

    CONSTRAINT [PK_UserName] PRIMARY KEY CLUSTERED ([ID] ASC) 
) ON [PRIMARY] 
GO 

Se voglio fare ID una colonna di identità, che cosa ho bisogno? Devo rilasciare e creare questo tavolo e impostare ID su [ID] [int] IDENTITY(1,1) NOT NULL.

Utilizzando drop e create, tutti i dati dalla tabella UserName vengono persi.

C'è un altro modo per impostare IDENTITY COLUMN su creato tabella colonna senza perdere i dati?

Io uso di SQL Server 2008 R2 :)

+3

È possibile eliminare solo la colonna - non l'intera tabella. Ma tu ** non puoi ** aggiungere la specifica 'IDENTITY' a una colonna esistente - ciò non è possibile. –

+0

Utilizzo di ALTER TABLE? – zey

+0

@marc_s: beh, questo ha senso. ma c'è un modo più semplice per farlo se la colonna ID della mia tabella è già stata utilizzata come FK da qualche altra parte? –

risposta

12
ALTER TABLE [UserName] DROP COLUMN [ID]; 

ALTER TABLE [UserName] 
    ADD [ID] integer identity not null; 
+0

Questo creerà la colonna ma tutti i dati andranno persi – Phil

+2

@Phil: no, non "tutti i dati". Solo i valori per la colonna 'ID' esistente. Quale potrebbe effettivamente essere un problema se la tabella è referenziata da altre tabelle. –

+0

Intendevo "Tutti i dati" nella colonna - ma grazie per aver chiarito – Phil

4

provare questo -

DECLARE @temp TABLE 
(
     ID INT NOT NULL 
    , Name NVARCHAR(50) NOT NULL 
    , [Address] NVARCHAR(200) NULL 
) 

INSERT INTO @temp (ID, Name, [Address]) 
SELECT ID, Name, [Address] 
FROM dbo.UserName 

DROP TABLE dbo.UserName 

CREATE TABLE dbo.UserName 
(
     [ID] [int] IDENTITY(1,1) NOT NULL 
    , [Name] [nvarchar] (50) NOT NULL 
    , [Address] [nvarchar] (200) NULL 
CONSTRAINT [PK_UserName] PRIMARY KEY CLUSTERED 
([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] 

SET IDENTITY_INSERT dbo.UserName ON 

INSERT INTO dbo.UserName (ID, Name, [Address]) 
SELECT ID, Name, [Address] 
FROM @temp 

SET IDENTITY_INSERT dbo.UserName OFF 
+2

usando il tavolo 'temp', è bello! – zey

1

Il modo più semplice: -

  1. Fare clic destro sul tavolo Esplora oggetti e seleziona "Design"
  2. Seleziona la colonna per cui vuoi impostare l'identità e andare a Proprietà colonna
  3. Sotto il cambiamento 'identità specifica' 'è l'identità' 'Sì'
  4. Fare clic su Salva .... Fatto :)

Spero che questo aiuti

0

Ecco un soluzione che è minimamente registrata.

SELECT 
    IDENTITY(INT, 1,1) AS ID, 
    Name, [Address] 
INTO dbo.UserName_temp 
FROM dbo.UserName; 


ALTER TABLE dbo.UserName_temp 
    ADD CONSTRAINT [PK_UserName] PRIMARY KEY CLUSTERED; 

DROP TABLE dbo.UserName; 

EXEC sp_rename 'dbo.UserName_temp', 'UserName'; 

SRC: http://sqlmag.com/sql-server/appending-identity-column-temporary-table

Ma la funzione IDENTITY() può "solo in un'istruzione SELECT con una clausola di tabella in"

http://msdn.microsoft.com/en-us/library/ms189838.aspx

Problemi correlati