OVH Cloud OVH Cloud

problème d'insertion avec PostgreSQL...

4 réponses
Avatar
yvon.thoravalNO-SPAM
j'ai le message d'erreur suivant :

Warning: pg_query(): Query failed: ERROR: duplicate key violates unique
constraint "tj_realise_rls_pkey"

alors que j'ai créé une séquence :

CREATE SEQUENCE tj_realise_seq;

puis altéré l'id de la table en question :

ALTER TABLE tj_realise_rls ALTER rls_id SET DEFAULT
nextval('tj_realise_seq');

ceci a pourtant bien fonctionné pour une autre table où j'ai pu
remarquer que pgsql a utilisé un trou dans la suite des id suite à un
delete.
--
yt

4 réponses

Avatar
Joseph
Bonsoir,
essaie quelque chose comme ça:
DROP SEQUENCE public.famappli_id_famappli_seq;

CREATE SEQUENCE public.famappli_id_famappli_seq INCREMENT 1 MINVALUE 1
MAXVALUE 2147483647 CACHE 1;

SELECT setval('public.famappli_id_famappli_seq', 10);

en remplacant 10 par le max de ta table +1.

la table qui utilise la sequence doit ressembler à ca:

CREATE TABLE public.famappli (

id_famappli int4 DEFAULT nextval('"famappli_id_famappli_seq"'::text) NOT
NULL,

lib_famappli varchar(50) NOT NULL,

CONSTRAINT famappli_pkey PRIMARY KEY (id_famappli)

) WITH OIDS;

j'ai été très surpris, agréablement d'ailleurs, de constater que
PostgreSQL a comblé dans la suite des id càd au lieu de prendre max(id)
+ 1 PostgreSQL a pris le premier et seul trou trouvé ds cette table...


c'est ca le probleme je pense. Au lieu de prendre 21 par exemple, il a du
prendre disons 9, le trou et maintenant à l'insert suivant il veut te creer
un enregistrement 10 qui existe déjà. Donc applique la recette plus haut.

Tant pis pour les trous.

Essaie de faire un insert à la main avec pgAdmin pour voir si le problème se
reproduit.



JB



"Yvon Thoraval" a écrit dans le message de
news:1g8atl7.3zhk4m1900ie1N%
Yvon Thoraval wrote:

> j'ai regardé avec phpPgAdmin mais je ne vois pas comment changer la
> valeur de la séquence.

j'ai fait un update comme ça, à partir d'aqua data studio :

update pg_class set reltuples = 21 where relname !~ '^pg_' and
relname !~ '^sql_' and relkind = 'i' and relname ~ '^tj_real'

(ce qui donne la pkey associée a l'id)

j'y ai mis donc 21 (max + 1)

mais ca n'a rien changé...
--
yt
Avatar
yvon.thoravalNO-SPAM
Joseph wrote:

DROP SEQUENCE public.famappli_id_famappli_seq;

CREATE SEQUENCE public.famappli_id_famappli_seq INCREMENT 1 MINVALUE 1
MAXVALUE 2147483647 CACHE 1;

SELECT setval('public.famappli_id_famappli_seq', 10);



dux-pécables !

merci j'étais bloqué sur ce coup là !

reste un p'tit truc, c'est que l'id retourné n'est pas le bon après un
insert le "pg_last_oid" me retourne 27126 alors que l'id est 22 (obtenu
par select * from la base concernée)

autre p'tit truc j'ai fait comme tu m'as dit le dernier id étant 20,
j'ai fait un setval 21 et l'id fut 22 il ya donc une pré-incrémentation
et non une post-incrémentation ?

en tk merci ca m'a bien dépatouillé...
--
yt
Avatar
Joseph
Bonsoir,
L'oid est un numéro interne au sgbd. Il est attribué à chaque objet (table,
tuples ...) C'est normal qu'il ne corresponde pas à l'id que tu définit dans
un champ. Ce n'est pas frmcement une bonne idée de l'utiliser, sauf dans de
rares cas. Si tu drop ta table et que tu la restaure, les oid des
enregistrements pourront être différents.
Concernant la séquence, le numéro stocké est effectivement le dernier
affecté.

JB

"Yvon Thoraval" a écrit dans le message de
news:1g8d7db.1299tjl1wcaa5jN%
Joseph wrote:

> DROP SEQUENCE public.famappli_id_famappli_seq;
>
> CREATE SEQUENCE public.famappli_id_famappli_seq INCREMENT 1 MINVALUE 1
> MAXVALUE 2147483647 CACHE 1;
>
> SELECT setval('public.famappli_id_famappli_seq', 10);

dux-pécables !

merci j'étais bloqué sur ce coup là !

reste un p'tit truc, c'est que l'id retourné n'est pas le bon après un
insert le "pg_last_oid" me retourne 27126 alors que l'id est 22 (obtenu
par select * from la base concernée)

autre p'tit truc j'ai fait comme tu m'as dit le dernier id étant 20,
j'ai fait un setval 21 et l'id fut 22 il ya donc une pré-incrémentation
et non une post-incrémentation ?

en tk merci ca m'a bien dépatouillé...
--
yt
Avatar
yvon.thoravalNO-SPAM
Joseph wrote:

L'oid est un numéro interne au sgbd. Il est attribué à chaque objet (table,
tuples ...) C'est normal qu'il ne corresponde pas à l'id que tu définit dans
un champ. Ce n'est pas frmcement une bonne idée de l'utiliser, sauf dans de
rares cas.



Bonsoir,

oui, oui, merci pour l'info en fait je viens juste de terminer la
migration de deux bases de mysql à postgresql de là vient ma confusion
avec l'oid je pensais que la fonction (php <--> PostgreSQL)
pg_last_oid($r) était "équivalente" à mysql_insert_id() (php <-->
MySQL).

Que nénni !

pour lire le dernier id d'une table donnée je fais ça :

select id from table where id = (select max(id) from table ) ;
--
yt