2010-11-11 6 views
2

Je souhaite ajouter une colonne à l'une de mes tables dans SQL Server. Je ne veux pas que ce soit à la fin de la liste des colonnes dans le tableau ... Je veux vraiment que ce soit ailleurs (emplacement sage) dans le tableau. Y at-il une autre option en plus de déposer et reconstruire (remplir) la table pour accomplir ceci? Je ne veux évidemment pas perdre mes données, mais je préférerais ne pas avoir la colonne à la fin de la définition de la table.SQL Server Ajouter une colonne

Merci,

S

Répondre

2

Réponse courte: Je suis d'accord avec OMG Ponies, l'ordre des colonnes n'a pas d'importance. Si vous n'avez pas d'index clusterisé, supprimez plutôt et recréer la table plutôt que d'exécuter un ALTER TABLE x ADD col.

Réponse longue: Si votre table a un peu juste des données (50Mo vient à l'esprit), alors vous serez mieux recréer la table plutôt que ALTER TABLE x ADD col Le plan d'allocation de pages de données pour la SQL Server place généralement les données de votre nouvelle colonne dans des pages séparées et met en avant les pointeurs de vos pages de données existantes vers les nouvelles pages de données pour la colonne que vous avez ajoutée. Si vous allez utiliser la nouvelle colonne de façon extensive, votre table d'E/S sera très médiocre, car même lire 1 ligne nécessitera de lire au moins 2 pages. Les analyses de table sont également peu performantes, car les pointeurs vers l'avant sont toujours suivis, ce qui entraîne des balayages de table normalement séquentiels pour faire des va-et-vient sur votre disque pendant une lecture.

Dans ce cas, il est préférable de renommer la table existante, recréer votre table avec la nouvelle colonne, insérer dans nom_table sélectionner col1, col2, 'null ou défaut pour nouvelle col', col3 de temp_renamed_table et enfin abandonner l'ancienne table vous avez renommé Les pages de données seront bien mieux organisées et vos E/S seront plus rapides, même si elles ont la même apparence du point de vue du développeur SQL que lorsque ALTER TABLE est utilisé. Si vous avez un index clusterisé, la table sera réorganisée lorsque vous ajouterez la colonne et les divisions de page seront moins probables. Vous pouvez également exécuter ALTER TABLE x REBUILD si vous avez SQL Server 2008, n'avez pas d'index clusterisé et beaucoup de temps lorsque les utilisateurs n'utilisent pas votre table. Il est difficile de commenter votre stratégie d'indexation sans en savoir beaucoup plus.

C'est une bien meilleure raison pour recréer la table que quelque chose de cosmétique comme l'ordre des colonnes.

+0

Sir Wobin, c'est la première fois que j'ai entendu dire que de "nouvelles colonnes" seront ajoutées de cette façon. Pouvez-vous poster quelques références en ligne qui en parlent? (Cela semble raisonnable, je veux juste obtenir beaucoup plus de profondeur et de détails sur le sujet, et je ne suis pas sûr de savoir comment Google le sujet.) –

+0

J'aime Philip aimerait voir tous les documents que vous avez sur ce sujet ... serait vraiment utile. – scarpacci

+0

Les concepts que vous recherchez sont des "séparations de page" et des "pointeurs de transfert". Voici 2 excellentes discussions avec des techniques pour les trouver sur vos tables, y compris des expériences pour déterminer quand elles se produisent. http://bit.ly/bIrQvp et http://bit.ly/df3Mp0 Voici une référence spécifique aux découpages de page résultant de l'ajout d'une colonne à une table existante. http://bit.ly/dAxPs0 –

-1
ALTER TABLE my_table ADD COLUMN column_name VARCHAR(50) AFTER col_name; 

substituant tout def que vous voulez pour VARCHAR (50)

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

Modifier Ceci est bien sûr la bonne réponse pour MySQL serveur ... mais ce n'est pas ce que l'OP veut.

+2

La question marquée comme "serveur SQL" ... –

+2

Cela ne fonctionne pas pour SqlServer. – GendoIkari

+4

@OMG Ponies, @Gendolkari Je pensais que mysqld était un serveur SQL. De toute façon, je ne peux rien obtenir aujourd'hui, alors je pars au pub. –

9

L'ordre des colonnes dans le tableau n'a pas d'importance - c'est purement cosmétique.
Il n'y a pas d'extension à ALTER TABLE qui vous permet de spécifier la position ordinale d'une nouvelle colonne (soit pour ajouter une nouvelle colonne ou déplacer une colonne existante).

Pour en savoir plus sur le sujet, voir:

+1

merci OMG Ponies .... vous fournissez toujours des informations utiles – scarpacci

+0

En outre, vous pouvez toujours créer une vue qui réorganise l'ordre des colonnes comme vous le souhaitez. –

1

Il est extrêmement dangereux de réorganiser les colonnes d'une table. N'envisage même pas d'essayer de faire une telle chose. L'ordre des colonnes n'est pas pertinent si vous avez utilisé des pratiques de codage correctes (comme jamais et je ne veux jamais dire) en utilisant select *. Si vous avez utilisé select * et que vous modifiez l'ordre des colonnes, vous risquez encore plus de casser le code car la requête ne peut pas attendre le prix comme troisième colonne mais comme la deuxième colonne et cela pourrait sérieusement gâcher beaucoup de choses. En outre, la seule façon de procéder est de créer une autre table, de déplacer vos données, puis de supprimer l'ancienne table et de renommer la première. Bien sûr, si vous avez des FK, ils doivent également être supprimés et recréés. Cela prend beaucoup de temps si vous avez un grand ensemble de données et pourrait causer des problèmes pour les utilisateurs.

Il n'y a pas d'endroit où vous pourriez envisager de le faire pour une table qui est en production, car c'est trop risqué. Si vous en êtes aux premiers stades de la conception, vous pourriez envisager de le faire.

Questions connexes