SQL Server aggiunge la chiave primaria di incremento automatico alla tabella esistente


253

Come titolo, ho una tabella esistente che è già popolata con 150000 record. Ho aggiunto una colonna Id (che è attualmente nulla).

Suppongo di poter eseguire una query per riempire questa colonna con numeri incrementali, quindi impostare come chiave primaria e attivare l'incremento automatico. È questo il modo corretto di procedere? E se è così, come posso riempire i numeri iniziali?

Risposte:


429

No - devi farlo al contrario: aggiungilo fin dall'inizio come INT IDENTITY- sarà riempito con valori di identità quando lo fai:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY

e quindi puoi renderlo la chiave primaria:

ALTER TABLE dbo.YourTable
   ADD CONSTRAINT PK_YourTable
   PRIMARY KEY(ID)

o se preferisci fare tutto in un solo passaggio:

ALTER TABLE dbo.YourTable
   ADD ID INT IDENTITY
       CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

2
Questa è davvero una buona risposta, ma come posso cambiare il numero intero iniziale da 1 a 1000? Vorrei iniziare a contare a 1000. Sospetto di poterlo utilizzare ALTER TABLE ORDER ALTER COLUMN ORDERNO RESTART WITH 1ma non volevo provarlo senza consultare un esperto :) Rif. pic.dhe.ibm.com/infocenter/iseries/v7r1m0/…
user1477388

3
Ho appena usato questo e sembra aver funzionatoalter table attachments add ATTACHMENT_NUMBER int identity (1000, 1)
user1477388

1
@stom: se non specifichi nulla, verranno utilizzati seed = 1 e increment = 1, che è comunque l'impostazione più utilizzata. Se hai creato una tabella come questa, funzionerà perfettamente. Ma consiglierei di specificare sempre esplicitamente il seme e l'incremento negli script SQL, specialmente per un sito più grande. È solo una buona pratica.
marc_s,

1
@stom: beh, PRIMARY KEYciò implica che NOT NULLè a posto - così di nuovo - non è assolutamente necessario. Ma preferisco essere esplicito e quindi ho sempre NOT NULLlì, solo per essere assolutamente chiaro
marc_s

3
@ turbo88: quando definisci il tuo PRIMARY KEY, l'indice cluster viene creato automaticamente per te (a meno che non specifichi esplicitamente NONCLUSTERED)
marc_s

19

Non puoi "attivare" l'IDENTITÀ: è una ricostruzione della tabella.

Se non ti interessa l'ordine dei numeri, aggiungerei la colonna, NON NULL, con IDENTITÀ in una volta sola. 150.000 righe non sono molte.

Se è necessario conservare un certo ordine numerico, aggiungere i numeri di conseguenza. Quindi utilizzare il designer di tabelle SSMS per impostare la proprietà IDENTITY. Ciò ti consente di generare uno script che farà cadere / aggiungere / mantenere i numeri / ridimensionare la colonna per te.


5
L'OP è su SQL Server 2008, quindi c'è un modo
Martin Smith,

L'intera istanza deve essere avviata in modalità utente singolo, quindi probabilmente non è praticabile per la maggior parte delle circostanze, ma è ALTER TABLE ... SWITCHpossibile farlo senza.
Martin Smith,

11

Ho avuto questo problema, ma non ho potuto utilizzare una colonna identità (per vari motivi). Ho optato per questo:

DECLARE @id INT
SET @id = 0 
UPDATE table SET @id = id = @id + 1 

Preso in prestito da qui .


4

Se la colonna esiste già nella tabella ed è nulla, puoi aggiornare la colonna con questo comando (sostituisci ID, tablename e tablekey):

UPDATE x
SET x.<Id> = x.New_Id
FROM (
  SELECT <Id>, ROW_NUMBER() OVER (ORDER BY <tablekey>) AS New_Id
  FROM <tablename>
  ) x

Mi hai risparmiato tempo con questo! Buon addendum alla risposta di @ gbn.
Kristen Waite,

2

Quando aggiungiamo e identifichiamo la colonna in una tabella esistente, questa si popolerà automaticamente senza bisogno di popolarla manualmente.


2

dal designer è possibile impostare l'identità (1,1) fare clic con il tasto destro su tbl => desing => in parte a sinistra (tasto destro) => proprietà => nelle colonne identità selezionare #colonna

Proprietà

colonna idendtity


1
Hai informazioni su se questo è un buon approccio? L'OP chiede se è il "modo corretto di procedere". Una risposta più completa potrebbe aiutarli a conoscere i pro / contro dell'approccio.
jinglesthula,

In realtà sto usando questa opzione nell'ambiente di sviluppo, se non si passa questa modifica alla produzione, è necessario verificare con VISUALIZZA DIPENDENZA se il campo identità viene utilizzato da una procedura Store o trigger.
gustavo herrera,

2

Se la tua tabella ha relazioni con altre tabelle usando la sua chiave primaria o foriegen, potrebbe essere impossibile modificare la tua tabella. quindi è necessario eliminare e creare nuovamente la tabella.
Per risolvere questi problemi è necessario generare script facendo clic con il pulsante destro del mouse sul database e in opzioni avanzate impostare il tipo di dati da script a schema e dati. successivamente, utilizzare questo script con la modifica della colonna per identificare e rigenerare la tabella mediante l'esecuzione della query.
la tua richiesta sarà come qui:

USE [Db_YourDbName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Drop TABLE [dbo].[Tbl_TourTable]

CREATE TABLE [dbo].[Tbl_TourTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NULL,
    [Family] [nvarchar](150) NULL)  

GO

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] ON 

INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')
INSERT [dbo].[Tbl_TourTable] ([ID], [Name], [Family]) VALUES (1,'name 1', 'family 1')

SET IDENTITY_INSERT [dbo].[Tbl_TourTable] off 

0

Ecco un'idea che puoi provare. Tabella originale - nessuna colonna di identità table1 crea una nuova tabella - chiama table2 insieme alla colonna di identità. copia i dati da tabella1 a tabella2: la colonna identità viene popolata automaticamente con numeri auto incrementati.

rinominare la tabella originale - da table1 a table3 rinominare la nuova tabella - da table2 a table1 (tabella originale) Ora avete table1 con la colonna di identità inclusa e popolata per i dati esistenti. dopo esserti assicurato che non ci siano problemi e che funzioni correttamente, elimina table3 quando non è più necessario.


0

Crea una nuova tabella con nome diverso e stesse colonne, associazione chiave primaria e chiave esterna e collegala nella tua dichiarazione di codice Inserisci. Ad esempio: per i DIPENDENTI, sostituire con DIPENDENTI.

CREATE TABLE EMPLOYEES(

    EmpId        INT NOT NULL IDENTITY(1,1), 
    F_Name       VARCHAR(20) ,
    L_Name       VARCHAR(20) ,
    DOB          DATE ,
    DOJ          DATE ,
    PRIMARY KEY (EmpId),
    DeptId int FOREIGN KEY REFERENCES DEPARTMENT(DeptId),
    DesgId int FOREIGN KEY REFERENCES DESIGNATION(DesgId),
    AddId int FOREIGN KEY REFERENCES ADDRESS(AddId)   
) 

Tuttavia, è necessario eliminare la tabella dei DIPENDENTI esistente o apportare alcune modifiche in base alle proprie esigenze.


0

Questa risposta è una piccola aggiunta alla risposta più votata e funziona per SQL Server. La domanda ha richiesto una chiave primaria di incremento automatico, la risposta corrente aggiunge la chiave primaria, ma non è contrassegnata come incremento automatico. Lo script seguente controlla le colonne, l'esistenza e lo aggiunge con il flag di incremento automatico abilitato.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' AND COLUMN_NAME = 'PKColumnName')
BEGIN


ALTER TABLE dbo.YourTable
   ADD PKColumnName INT IDENTITY(1,1)

CONSTRAINT PK_YourTable PRIMARY KEY CLUSTERED

END

GO

0
ALTER TABLE table_name ADD temp_col INT IDENTITY(1,1) 
update 

5
Puoi spiegarlo?
Muhammad Dyas Yaskur il

1
Sebbene questo codice possa risolvere il problema del PO, è meglio includere una spiegazione su come il codice risolve il problema del PO. In questo modo, i futuri visitatori possono imparare dal tuo post e applicarlo al proprio codice. SO non è un servizio di codifica, ma una risorsa per la conoscenza. Inoltre, è più probabile che vengano votate risposte complete e di alta qualità. Queste caratteristiche, insieme alla necessità che tutti i post siano autosufficienti, sono alcuni dei punti di forza di SO come piattaforma, che lo differenzia dai forum. È possibile modificare per aggiungere ulteriori informazioni e / o integrare le proprie spiegazioni con la documentazione di origine.

-1

modifica tabella / ** incolla il nome della tabella ** / aggiungi ID int IDENTITÀ (1,1)

elimina da / ** incolla il nome del tabal ** / dove id in

(

seleziona a.id FROM / ** incolla il nome del tabal / come LEFT OUTER JOIN (SELECT MIN (id) come id FROM / incolla il nome del tabal / GROUP BY / incolla le colonne c1, c2 .... ** /

) as t1 
ON a.id = t1.id

DOVE t1.id È NULL

)

alter table / ** incolla il nome del tabal ** / DROP COLUMN id


Qual'è la tua domanda? Come chiedere
Ann Kilzer,

1
Modifica la tua risposta, usando il markdown per formattare correttamente il tuo esempio di codice.
Bill Keller,

-3

Prova qualcosa del genere (prima su una tabella di prova):

USA your_database_name
PARTIRE
WHILE (SELEZIONA COUNT (*) DA your_table DOVE your_id_field È NULL)> 0
INIZIO
    SET ROWCOUNT 1
    AGGIORNA your_table SET your_id_field = MAX (your_id_field) +1
FINE
STAMPA "TUTTO FATTO"

Non l'ho provato affatto, quindi fai attenzione!


1
-1 Non risponde alla domanda (che riguarda l'aggiunta di IDENTITYcolonne) e non funzionerebbe comunque. UPDATE your_table SET your_id_field = MAX(your_id_field)+1non puoi semplicemente buttarti dentro MAX. Dov'è una WHEREclausola per evitare di aggiornare ripetutamente la stessa riga?
Martin Smith,

-3

Funziona in MariaDB, quindi posso solo sperare che lo faccia in SQL Server: rilascia la colonna ID che hai appena inserito, quindi usa la sintassi seguente: -

ALTER TABLE table_name ADD id INT TASTO PRIMARIO AUTO_INCREMENT;

Non è necessario un altro tavolo. Ciò inserisce semplicemente una colonna ID, lo rende l'indice primario e lo popola con valori sequenziali. Se SQL Server non lo farà, mi scuso per aver perso tempo.


-3

ALTER TABLE table_name AGGIUNGI ID COLONNA INT NON NULL TASTO PRIMARIO AUTO_INCREMENT; Questo potrebbe essere utile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.