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 ?
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é.
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' ;)
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.