2008-09-20 7 views
97

Je souhaite ajouter une colonne à une base de données existante existante et écrire une procédure permettant d'attribuer à chaque enregistrement une valeur différente. Quelque chose comme ajouter une colonne et générer automatiquement les données pour cela. Par exemple, si j'ajoute une nouvelle colonne appelée "ID" (nombre), je veux initialiser une valeur unique pour chacun des enregistrements. Donc, ma colonne d'identification aura des enregistrements de 1 à 1000. Comment faire?Ajouter une colonne à une table existante et les numéroter de manière unique

+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

+0

Je travaille dans SQL Server. –

+1

Vous devriez éditer votre question pour le mentionner. – dvorak

Répondre

176

Cela dépendra de la base de données mais pour SQL Server, cela pourrait se faire comme suit:

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

Cela a fonctionné magnifiquement et ajouté tous les numéros dont j'avais besoin automatiquement. Merci! – djangofan

+7

Si vous avez des problèmes pour changer avec le logiciel de gestion, vous pouvez changer les paramètres sous/Outils/Options/Concepteur/Table et Base de données Desiger vous trouverez une case à cocher "Empêcher les modifications nécessitant une recréation". sera en mesure d'ajouter une colonne d'identité, même en utilisant le GUI. – surfmuggle

+0

merci de poster –

4

Tout en utilisant la commande ALTER TABLE devrait fonctionner. Ajoutez la colonne avec le type et un drapeau d'identité et il devrait faire l'affaire

Vérifiez cet article MSDN http://msdn.microsoft.com/en-us/library/aa275462(SQL.80).aspx sur la syntaxe ALTER TABLE

+0

Merci pour le ref de l'article. D'une manière ou d'une autre, je n'avais jamais lu d'IDENTITÉ auparavant! –

0

Cela dépend de la base de données que chaque base de données a une façon différente d'ajouter la séquence Nombres. Je voudrais modifier la table pour ajouter la colonne puis écrire un script DB dans groovy/python/etc pour lire dans les données et mettre à jour l'ID avec une séquence. Une fois les données définies, j'ajouterais une séquence à la table qui commence après le nombre supérieur. Une fois les données définies, définissez correctement les clés primaires.

10

pour Oracle que vous pourriez faire quelque chose comme ci-dessous

alter table mytable add (myfield integer); 

update mytable set myfield = rownum; 
+0

Roy Tang: Cela a été d'une grande aide. Merci! – Abdul

19

Il serait utile si vous avez publié ce que 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

Vous ne savez pas si cela applique rétroactivement les valeurs. Si ce n'est pas le cas, vous devriez juste 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 fonction LAST_INSERT_ID() pour générer la valeur de l'ID.

+6

Je peux aussi confirmer que cela fonctionne bien pour MySQL; J'ai simplement ajouté un champ d'identifiant incrémenté à une table non indexée existante et chaque rangée a un nouvel identifiant unique. –

+0

Désolé c'est un ancien mais il a dit serveur SQL dans le titre. – Nick

+0

@Nick cette réponse est utile pour moi –

5

Et l'équivalent Postgres (deuxième ligne est obligatoire que si vous voulez « id » être une clé):

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

Si vous ne voulez pas que votre nouvelle colonne à être de type IDENTITY (auto increment), ou 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 Sever 2005 et plus tard, à savoir les versions qui supportent ROW_NUMBER()

0

pour UNIQUEIDENTIFIER type de données dans le serveur sql essayer

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

Si vous voulez créer la clé primaire de cette Utilisez cette colonne

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