2017-09-29 40 views
0

Est-il possible de modifier uniquement une table pour faire d'une colonne existante une clé générée automatiquement, sans ajouter de nouvelle colonne? Désolé si cette question est un peu newbie-ish pour PostgreSQL, je suis plutôt une personne SQL Server mais je passe à PostgreSQL.Peut-on modifier une table PostgresSql pour avoir des clés générées automatiquement une fois que la table a des valeurs?

Dans un shell, le programme copiera une base de données SQL Server existante dans PostgreSQL. Avec le désir d'avoir une base de données en miroir dans PostgreSQL comme la source de SQL Server avec la seule mise en garde on peut sélectivement inclure/exclure n'importe quelle table ou colonne, ou tout faire ...

Étant donné que le processus copie toutes les valeurs, pensé que l'on devrait être capable de créer les clés après que la copie a terminé comme on peut le faire dans SQL Server. Pensée PostgreSQL aurait des méthodes comparables à celles de SQL Server SET INSERT_IDENTITY [ON|OFF] afin que l'on puisse remplacer la clé générée automatiquement avec une valeur désirée. Ne pas voir d'équivalent dans PostgreSQL. Donc mon fallback est de créer les enregistrements en miroir dans Postgres sans clé aucune clé, puis modifier les tables. Mais il semble fixer la table comme désiré on a créé une nouvelle colonne, mais en faisant cette pause ou en causant un mal de tête en ajustant le RI pour les relations PK/FK.

Des suggestions? Merci d'avance.

Répondre

0

Dans PostgreSQL, la clé générée automatiquement est toujours substituée si vous lui insérez une valeur explicite. Si vous ne spécifiez pas de valeur (omettez la colonne) ou spécifiez le mot-clé DEFAULT, une clé générée est utilisée.

table donnée

CREATE TABLE t1 (id serial primary key, dat text); 

alors ces deux vous obtiendrez une clé générée à partir de la séquence t1_id_seq:

INSERT INTO t1 (dat) VALUES ('fred'); 
INSERT INTO t1 (id, dat) VALUES (DEFAULT, 'bob'); 

Cela place fournir sa propre valeur:

INSERT INTO t1 (id, dat) VALUES (42, 'joe'); 

Vous êtes responsable pour s'assurer que la valeur fournie n'est pas en conflit avec les données existantes, ou avec des valeurs futures, la séquence d'identité va générer. PostgreSQL va not notez que vous avez manuellement inséré une ligne avec l'ID 42 et passez lorsque son propre compteur de séquence arrive à ce point.

Habituellement, ce que vous faites est de charger avec les valeurs fournies, puis réinitialiser la séquence au maximum de toutes les clés déjà dans la table, de sorte qu'il continue à compter à partir de là pour les nouvelles insertions locales.