Comment définir la clé primaire d'incrément automatique dans PostgreSQL?

J'ai une table dans PostgreSQL avec 22 colonnes, et je veux ajouter une clé primaire d'incrément automatique.

J'ai essayé de créer une colonne appelée id de type BIGSERIAL mais pgadmin a répondu avec une erreur:

ERROR: sequence must have same owner as table it is linked to.

Personne Ne sait comment résoudre ce problème? Comment puis-je ajouter un créer une clé primaire auto-incrémentée dans PostgreSQL sans recréer la table à nouveau?

234
demandé sur SeldomNeedy 2011-10-11 00:56:40

6 réponses

Essayez cette commande:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Essayer avec le même utilisateur de la base que celui que vous avez créé la table.

258
répondu A.H. 2011-10-10 21:10:26

Incrémentation automatique de la clé primaire dans postgresql:

L'Étape 1, créez votre tableau:

CREATE TABLE epictable
(
    mytable_key    serial primary key,
    moobars        VARCHAR(40) not null,
    foobars        DATE
);

Étape 2, Insérez des valeurs dans votre table comme ceci, notez que mytable_key n'est pas spécifié dans la première liste de paramètres, cela provoque l'auto-incrémentation de la séquence par défaut.

insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')

Étape 3, Sélectionnez * dans votre table:

el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

Étape 4, interpréter la sortie:

mytable_key  |        moobars        |  foobars   
-------------+-----------------------+------------
           1 | delicious moobars     | 2012-05-01
           2 | world wide interblags | 2012-05-02
(2 rows)

Observez que la colonne mytable_key a été auto incrémenté.

ProTip:

Vous devriez toujours utiliser une clé primaire sur votre table car postgresql utilise en interne des structures de table de hachage pour augmenter la vitesse des insertions, des suppressions, des mises à jour et des sélections. Si une colonne de clé primaire (qui est forcée unique et non nulle) est disponible, elle peut être dépendante pour fournir une graine unique pour la fonction de hachage. Si aucune colonne de clé primaire n'est disponible, la fonction de hachage devient inefficace car elle sélectionne un autre ensemble de colonnes en tant que clé.

240
répondu Eric Leschinski 2013-12-28 16:56:42

Créez une clé primaire incrémentée automatiquement dans postgresql, en utilisant une séquence personnalisée:

Étape 1 créer votre séquence:

create sequence splog_adfarm_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;

L'Étape 2, créez votre table

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

L'Étape 3, insérez dans votre tableau

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Is your family tree a directed acyclic graph?'
);

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Will the smart cookies catch the crumb?  Find out now!'
);

Étape 4, observez les lignes

el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"

splog_key |                            splog_value                             
----------+--------------------------------------------------------------------
        1 | Is your family tree a directed acyclic graph?
        2 | Will the smart cookies catch the crumb?  Find out now!
(3 rows)

Les deux lignes ont des clés qui commencent à 1 et sont incrémentées de 1, comme défini par la séquence.

Bonus Élite ProTip:

Programmeurs je déteste taper, et taper le nextval('splog_adfarm_seq') est ennuyeux. Vous pouvez taper DEFAULT pour ce paramètre à la place, comme ceci:

insert into splog_adfarm values (
    DEFAULT, 
    'Sufficient intelligence to outwit a thimble.'
);

Pour que ce qui précède fonctionne, vous devez définir une valeur par défaut pour cette colonne de clé sur la table splog_adfarm. Ce qui est plus joli.

30
répondu Eric Leschinski 2017-12-28 20:42:14

Si vous voulez faire cela dans pgadmin, c'est beaucoup plus facile. Il semble en postgressql, pour ajouter un incrément automatique à une colonne, il faut d'abord créer un incrément automatique de la séquence et l'ajouter à la colonne requise. J'ai fait comme cela.

1) Tout d'abord, vous devez vous assurer qu'il existe une clé primaire pour votre table. Conservez également le type de données de la clé primaire dans bigint ou smallint. (J'ai utilisé bigint, Je n'ai pas pu trouver un type de données appelé serial comme mentionné dans d'autres réponses ailleurs)

2) puis ajoutez un séquence en cliquant avec le bouton droit sur Séquence - > Ajouter une nouvelle séquence . S'il n'y a pas de données dans la table, laissez la séquence telle quelle, n'effectuez aucune modification. Il suffit de la sauvegarder. S'il existe des données existantes, ajoutez la dernière valeur ou la plus élevée dans la colonne clé primaire à la valeur actuelle dans L'onglet Définitions comme indiqué ci-dessous. entrez la description de l'image ici

3) enfin, ajoutez la ligne nextval('your_sequence_name'::regclass) à la valeur par défaut de votre clé primaire comme indiqué ci-dessous.

entrez la description de l'image ici Assurez-vous que le nom de la séquence est correcte ici. C'est tout et incrément automatique devrait fonctionner.

16
répondu toing_toing 2015-10-30 07:10:52

Si vous voulez utiliser des nombres dans une séquence, définissez une nouvelle séquence avec quelque chose comme

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

Puis modifiez la table pour utiliser la séquence de l'id:

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);
2
répondu acaruci 2018-02-06 15:04:53

Peut-être que je suis un peu en retard pour répondre à cette question, mais je travaille sur ce sujet à mon travail:)

, je voulais écrire la colonne "a_code' = c1,c2,c3,c4...

Tout d'Abord, j'ai ouvert une colonne avec le nom de ref_id et le type serial. Ensuite, j'ai résolu mon problème avec cette commande:

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 
0
répondu user5838061 2016-01-25 16:55:37