Aggiungi una colonna alla tabella esistente e numerale in modo univoco su MS SQL Server


121

Voglio aggiungere una colonna a un database legacy esistente e scrivere una procedura mediante la quale posso assegnare a ciascun record un valore diverso. Qualcosa come l'aggiunta di una colonna e la generazione automatica dei dati per essa.

Ad esempio, se aggiungo una nuova colonna chiamata "ID" (numero), desidero inizializzare un valore univoco per ciascuno dei record. Quindi, la mia colonna ID avrà record da dire 1 to 1000.
Come lo faccio?


2
Questo sarà specifico del database. Dovresti specificare con quale database stai lavorando.
dvorak

1
Dovresti modificare la tua domanda per menzionarlo.
dvorak

Risposte:


221

Ciò dipenderà dal database, ma per SQL Server, ciò potrebbe essere ottenuto come segue:

alter table Example
add NewColumn int identity(1,1)

5
Ha funzionato magnificamente e ha aggiunto tutti i numeri di cui avevo bisogno automaticamente. Grazie!
Djangofan

9
Se hai problemi ad apportare modifiche con la gui dello studio di gestione puoi modificare le impostazioni in / Strumenti / Opzioni / Designer / Tabella e Database Desiger troverai una casella di controllo Prevent saving changes that require table re-creationdeseleziona quella casella e sarai in grado di aggiungere una colonna identità anche usando il gUI.
surfmuggle

22

Sarebbe utile se pubblicassi il database SQL che stai utilizzando. Per MySQL probabilmente vorrai auto_increment:

ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY

Non sono sicuro che questo applichi i valori retroattivamente. In caso contrario, dovresti essere in grado di iterare sui tuoi valori con una procedura memorizzata o in un semplice programma (a condizione che nessun altro stia scrivendo nel database) e impostare l'uso della LAST_INSERT_ID()funzione per generare il valore id.


7
Posso anche confermare che questo funziona davvero per MySQL; Ho appena aggiunto un campo ID incrementale a una tabella non indicizzata esistente e ogni riga ha un nuovo ID univoco.
Doug Kavendek

Spiacente, è vecchio ma nel titolo c'era scritto SQL server.
Nick

11

per Oracle potresti fare qualcosa di simile sotto

alter table mytable add (myfield integer);

update mytable set myfield = rownum;

8

E l'equivalente di Postgres (la seconda riga è obbligatoria solo se vuoi che "id" sia una chiave):

ALTER TABLE tableName ADD id SERIAL;
ALTER TABLE tableName ADD PRIMARY KEY (id);


3

per il tipo di dati UNIQUEIDENTIFIER nel server sql prova questo

Alter table table_name
add ID UNIQUEIDENTIFIER not null unique default(newid())

Se vuoi creare la chiave primaria da quella colonna, usa questa

ALTER TABLE table_name
ADD CONSTRAINT PK_name PRIMARY KEY (ID);

0

Dipende dal database poiché ogni database ha un modo diverso per aggiungere numeri di sequenza. Modificherei la tabella per aggiungere la colonna, quindi scrivere uno script db in groovy / python / ecc per leggere i dati e aggiornare l'id con una sequenza. Una volta impostati i dati, aggiungerei una sequenza alla tabella che inizia dopo il numero in alto. Una volta impostati i dati, impostare correttamente le chiavi primarie.


0

Se non vuoi che la tua nuova colonna sia di tipo IDENTITY(incremento automatico), o vuoi essere specifico sull'ordine in cui le tue righe sono numerate, puoi aggiungere una colonna di tipo INT NULLe poi popolarla in questo modo. Nel mio esempio, la nuova colonna si chiama MyNewColumn e la colonna della chiave primaria esistente per la tabella si chiama MyPrimaryKey.

UPDATE MyTable
SET MyTable.MyNewColumn = AutoTable.AutoNum
FROM
(
    SELECT MyPrimaryKey, 
    ROW_NUMBER() OVER (ORDER BY SomeColumn, SomeOtherColumn) AS AutoNum
    FROM MyTable 
) AutoTable
WHERE MyTable.MyPrimaryKey = AutoTable.MyPrimaryKey  

Funziona in SQL Server 2005 e versioni successive, ovvero versioni che supportano ROW_NUMBER()

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.