Ajouter une colonne à la table existante et les numéroter de manière unique sur MS SQL Server

121

Je souhaite ajouter une colonne à une base de données héritée existante et écrire une procédure par laquelle je peux attribuer à chaque enregistrement une valeur différente. Quelque chose comme ajouter une colonne et générer automatiquement les données correspondantes.

Par exemple, si j'ajoute une nouvelle colonne appelée "ID" (numéro), je veux ensuite initialiser une valeur unique pour chacun des enregistrements. Ainsi, ma colonne d' identité contiendra des enregistrements par exemple 1 to 1000.
Comment je fais ça?

Adhip Gupta
la source
2
Cela va être spécifique à la base de données. Vous devez spécifier la base de données avec laquelle vous travaillez.
dvorak
1
Vous devriez modifier votre question pour le mentionner.
dvorak

Réponses:

221

Cela dépendra de la base de données, mais pour SQL Server, cela peut être réalisé comme suit:

alter table Example
add NewColumn int identity(1,1)
Simon Johnson
la source
5
Cela a fonctionné à merveille et a ajouté automatiquement tous les chiffres dont j'avais besoin. Merci!
djangofan
9
Si vous rencontrez des problèmes pour effectuer des modifications avec l'interface graphique du studio de gestion, vous pouvez modifier les paramètres sous / Outils / Options / Designer / Table et Database Desiger, vous trouverez une case à cocher Prevent saving changes that require table re-creationdécocher cette case et vous pourrez ajouter une colonne d'identité même en utilisant le gui.
surfmuggle
22

Il serait utile de publier la base de données SQL que vous utilisez. Pour MySQL, vous voulez probablement auto_increment:

ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY

Je ne sais pas si cela applique les valeurs rétroactivement. Si ce n'est pas le cas, vous devriez simplement pouvoir parcourir vos valeurs avec une procédure stockée ou dans un programme simple (tant que personne d'autre n'écrit dans la base de données) et utiliser la LAST_INSERT_ID()fonction pour générer la valeur d'id.

Tom Martin
la source
7
Je peux tout aussi bien confirmer que cela fonctionne bien pour MySQL; Je viens d'ajouter un champ d'identifiant incrémentiel à une table non indexée existante et chaque ligne a un nouvel identifiant unique.
Doug Kavendek
Désolé, c'est un ancien mais il a dit serveur SQL dans le titre.
Nick
11

pour oracle, vous pouvez faire quelque chose comme ci-dessous

alter table mytable add (myfield integer);

update mytable set myfield = rownum;
Roy Tang
la source
8

Et l'équivalent Postgres (la deuxième ligne n'est obligatoire que si vous voulez que "id" soit une clé):

ALTER TABLE tableName ADD id SERIAL;
ALTER TABLE tableName ADD PRIMARY KEY (id);
Flavien Volken
la source
3

pour le type de données UNIQUEIDENTIFIER dans le serveur SQL, essayez ceci

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

Si vous souhaitez créer une clé primaire à partir de cette colonne, utilisez ceci

ALTER TABLE table_name
ADD CONSTRAINT PK_name PRIMARY KEY (ID);
Snziv Gupta
la source
0

Dépend de la base de données car chaque base de données a une manière différente d'ajouter des numéros de séquence. Je modifierais la table pour ajouter la colonne puis j'écrirais un script db dans groovy / python / etc pour lire les données et mettre à jour l'identifiant avec une séquence. Une fois que les données ont été définies, j'ajouterais une séquence au tableau qui commence après le nombre supérieur. Une fois les données définies, définissez correctement les clés primaires.

Joshua
la source
0

Si vous ne voulez pas que votre nouvelle colonne soit de type IDENTITY(auto-incrémentation), ou que vous voulez être précis sur l'ordre dans lequel vos lignes sont numérotées, vous pouvez ajouter une colonne de type INT NULL, puis la remplir comme ceci. Dans mon exemple, la nouvelle colonne s'appelle MyNewColumn et la colonne de clé primaire existante pour la table s'appelle 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  

Cela fonctionne dans SQL Server 2005 et versions ultérieures, c'est-à-dire les versions qui prennent en charge ROW_NUMBER()

Jinlye
la source