Comment définir une clé primaire auto incrémentée dans PostgreSQL ?

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

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.

Quelqu'un sait-il comment résoudre ce problème ? Comment ajouter une clé primaire auto-incrémentée dans PostgreSQL sans recréer la table ?

Solution

Essayez cette commande :

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Essayez-la avec le même utilisateur de la base de données que celui qui a créé la table.

Commentaires (11)

Clé primaire auto incrémentée dans postgresql :

Etape 1, créer votre table:

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

Etape 2, insérez des valeurs dans votre table comme ceci, remarquez 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 à partir de votre table :**

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

Etape 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ée.

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, suppressions, mises à jour et sélections. Si une colonne de clé primaire (qui est forcée à être unique et non nulle) est disponible, on peut compter sur elle 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 comme clé.

Commentaires (3)

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

Etape 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;

Etape 2, créez votre tableau

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

Etape 3, insérer dans votre table

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!'
);

Etape 4, observer 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 rangées ont des clés qui commencent à 1 et sont incrémentées de 1, comme défini par la séquence.

Bonus Elite ProTip:

Les programmeurs détestent taper, et taper le nextval('splog_adfarm_seq&#39 ;) 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 la méthode ci-dessus fonctionne, vous devez définir une valeur par défaut pour cette colonne clé dans la table splog_adfarm. Ce qui est plus joli.

Commentaires (2)