web-dev-qa-db-fra.com

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

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

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

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

Est-ce que quelqu'un sait comment résoudre ce problème? Comment puis-je ajouter une clé primaire auto-incrémentée dans PostgreSQL ™ sans recréer la table?

241
mkn

Essayez cette commande:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

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

267
A.H.

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

Etape 1, créez votre table:

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

Étape 2, insérez des valeurs dans votre table, notez que mytable_key n'est pas spécifié dans la première liste de paramètres. La séquence par défaut est alors automatiquement incrémentée.

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 tableau:

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

Étape 4, interpréter le résultat:

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

Notez que la colonne mytable_key a été incrémentée automatiquement.

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 d'insertion, de suppression, de mise à jour et de sélection. Si une colonne de clé primaire (unique unique forcée et non nulle) est disponible, vous pouvez compter sur elle pour fournir un germe unique à 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é.

242
Eric Leschinski

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

Étape 1, créez 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 table

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

Étape 3, insérez 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!'
);

É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 Elite ProTip:

Les programmeurs détestent taper, et taper la 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 clé dans la table splog_adfarm. Ce qui est plus joli.

33
Eric Leschinski

Si vous voulez faire cela dans pgadmin, c'est beaucoup plus facile. Il semble qu'en postgressql, pour ajouter une incrémentation automatique à une colonne, nous devons d'abord créer une séquence d'incrémentation automatique et l'ajouter à la colonne requise. J'ai fait comme ça.

1) Premièrement, 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, impossible de trouver un type de données appelé serial tel que mentionné dans d'autres réponses ailleurs)

2) Ajoutez ensuite une séquence en cliquant avec le bouton droit de la souris sur sequence-> ajouter une nouvelle séquence . S'il n'y a pas de données dans la table, laissez la séquence en l'état, n'apportez aucune modification. Enregistrez-le simplement . S'il existe des données, ajoutez la dernière valeur ou la valeur la plus élevée dans la colonne de clé primaire à la valeur actuelle dans l'onglet Définitions, comme indiqué ci-dessous .  enter image description here

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

 enter image description here Assurez-vous que le nom de la séquence est correct ici. C'est tout et l'incrémentation automatique devrait fonctionner.

16
toing_toing

Si vous souhaitez 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 pour l'id:

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);
2
acaruci

J'ai essayé le script suivant pour réussir à incrémenter automatiquement la clé primaire dans PostgreSQL.

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);
0
Asad Shakeel

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

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

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

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 
0
user5838061