Comment ajouter une nouvelle Colonne dans une table après la 2ème ou de la 3ème colonne dans la Table à l'aide de postgres?
Comment ajouter une nouvelle colonne dans une table après la 2ème ou de la 3ème colonne dans la table à l'aide de postgres?
Mon code se présente comme suit
ALTER TABLE n_domains ADD COLUMN contract_nr int after owner_id
- L'ordre des colonnes est totalement hors de propos dans les bases de données relationnelles - c'est seulement une question de les afficher dans un outil. La table de base de données n'est pas du tout de l'ordre des colonnes.
- incorrect. L'ordre physique est pertinente pour la performance. Et le courant de PostgreSQL utilise la même logique et physique de l'ordre. wiki.postgresql.org/wiki/Alter_column_position
Vous devez vous connecter pour publier un commentaire.
Non, il n'y a pas de moyen direct de le faire. Et il y a une raison pour chaque requête doit répertorier tous les domaines dont il a besoin dans n'importe quel ordre (et le format, etc), il a besoin d'eux, rendant ainsi l'ordre des colonnes dans une table insignifiant.
Si vous avez vraiment besoin de faire ce que je peux penser à une solution de contournement:
pg_dump --schema-only --table=<schema.table> ...
)<new_table>
SELECT champ1, champ2,<default_for_new_field>
, champ3,... à PARTIR de<old_table>
';L'ordre des colonnes n'est pas pertinent, de mettre une largeur fixe de colonnes à l'avant de la table permet d'optimiser la disposition du stockage de vos données, il peut également rendre l'utilisation de données plus facile à l'extérieur de votre code d'application.
PostgreSQL ne prend pas en charge modifiant la colonne de commande (voir Modifier position de la colonne sur PostgreSQL wiki); si la table est relativement isolé, votre meilleur pari est de recréer la table:
Si vous avez beaucoup de points de vue ou des contraintes définies sur le tableau, vous pouvez ajouter de nouveau toutes les colonnes après la nouvelle colonne et déposez les colonnes d'origine (voir l'PostgreSQL wiki pour obtenir un exemple).
Le vrai problème ici, c'est que c'est pas encore fait. Actuellement, PostgreSQL est de l'ordre logique est la même que la physique de la commande. C'est problématique parce que vous ne pouvez pas obtenir un autre ordre logique, mais c'est encore pire, car la table n'est pas physiquement emballés automatiquement, donc en déplaçant les colonnes que vous pouvez obtenir différentes caractéristiques de performance.
Arguant que c'est de cette façon par l'intention de la conception est inutile. Il est un peu susceptible de changer à un moment donné de l'acceptable patch est soumis.
Tout ce qui est dit, est-ce une bonne idée de s'appuyer sur l'ordinal de positionnement des colonnes, logique ou physique? L'enfer n'. Dans le code de production, vous ne devez jamais utiliser un implicite de la commande ou
*
. Pourquoi rendre le code plus fragile qu'elle ne doit l'être? L'exactitude doit toujours être une priorité supérieure à celle de l'enregistrement d'un clavier.Pour contourner ce problème, vous pouvez en effet modifier la colonne de la commande par de recréer la table, ou par le biais de la "ajouter et réorganiser" le jeu
Voir aussi,
L'ordre des colonnes est pertinent pour moi, donc j'ai créé cette fonction. Voir si ça aide. Il fonctionne avec les index, les clés primaires et les déclencheurs. Manquant de points de Vue et de Clé Étrangère et d'autres fonctionnalités sont manquantes.
Exemple:
Code Source:
, condition_timing as cond
dertgr
et ` || '' || rtgr.cond "devtgr
Ajouté ` || 'CASCADE" pour gérer les tables liées surEXECUTE 'DROP TABLE ' || ptable;
btw, cette belle fonction est inutile, car elle semble poignée de minuscules les noms de colonne de...@Jeremy Gustie la solution ci-dessus fonctionne presque, mais va faire la mauvaise chose si les ordinaux sont off (ou un échec total si le re-commandé ordinaux rendre incompatible types de match). Essayez-le:
Les résultats montrent le problème:
Vous pouvez remédier à cela en spécifiant les noms de colonne dans l'insert:
Que vous donne ce que vous voulez vraiment:
Le problème vient quand vous avez héritage qui ne fait pas cela, comme je l'ai indiqué ci-dessus dans mon commentaire sur peufeu réponse.
Mise à jour: Il m'est apparu que vous pouvez faire la même chose avec les noms de colonne dans l'INSERTION de la clause en spécifiant les noms de colonne dans la clause SELECT. Vous avez juste à les réorganiser afin de correspondre à la ordinaux dans la table cible:
Et bien sûr, vous pouvez faire les deux à être très explicite:
Qui vous donne les mêmes résultats que ci-dessus, avec les valeurs de la colonne correctement appariés.
Oui.
Par exemple, si vous utilisez Python, vous feriez :
Ou vous feriez :
Mais personne de sensé ne jamais utiliser de position des résultats du type :
peufeu
dit.@ Milen A. Radev
La pertinence besoin d'avoir un ensemble de commande de colonnes n'est pas toujours défini par la requête qui les tire. Dans les valeurs de
pg_fetch_row
ne comprend pas le nom de colonne associé et donc nécessiterait des colonnes définies par l'instruction SQL.Un simple
select * from
nécessiterait la connaissance innée de la structure de la table, et parfois causer des problèmes si l'ordre des colonnes étaient à changer.À l'aide de
pg_fetch_assoc
est une méthode plus fiable que vous pouvez faire référence à des noms de colonnes, et donc d'utiliser un simpleselect * from
.SELECT *
et pourtant, je veux le plus intéressant colonnes venir en premier.