PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Général » id exponentielle sur un merge » 15/09/2022 14:11:07

rjuju a écrit :

Vous comprenez bien que cette mise à jour se fait en tenant compte des règles d'isolation standard, et vous pouvez donc réinitialiser à une valeur inférieure à ce qui pourrait exister une fois une transaction concurrente committée, ce qui aurait comme conséquence de retourner des valeurs déjà utilisées.  Et dans ce cas, de nombreuses requêtes pourraient échouer, soit immédiatement soit longtemps après, en fonction de l'activité concurrente.

Je n'avais pas pris cet élément en compte, car dans mon cas et pour cette db, je n'ai pas de transaction concurrente.
Merci pour le rappel à l'ordre smile

#2 Re : Général » id exponentielle sur un merge » 15/09/2022 10:04:57

Je reviens car pour ne pas incrémenter inutilement, j'ai ajouter ceci dans mon script, a adapter en fonction des ses tables et séquences (Merci Alban)

SELECT setval('testing_hash_id_seq', MAX(id), true) FROM testing_hash;

#4 Re : Général » id exponentielle sur un merge » 19/05/2022 13:38:40

Oui largement, j'avais lu 2.31 pour le bigserial
Merci de l'info.

#5 Re : Général » id exponentielle sur un merge » 19/05/2022 10:58:42

Ok, du coup, faut que je trouve une autre façon de gérer mes id, j'imagine que j'aurais moins de souci avec un uuid ? car vu la doc un bigserial c'est 2 exp 31

#6 Re : Général » id exponentielle sur un merge » 19/05/2022 10:31:53

Merci pour la réponse.
Du coup, est-il possible de modifier la séquence pour utiliser les id's non utilisés ?

#7 Général » id exponentielle sur un merge » 11/05/2022 13:20:33

maitrepylos
Réponses : 12

Bonjour,
j'ai une fonction qui fait un genre de merge

DECLARE
    v_email_ad varchar;
    v_email_perso varchar; 
    v_annee_academique integer; 
    v_email_ordre integer; 
    v_classe varchar;
    v_matric_rs integer; 
    v_numero integer; 
    v_statut varchar; 
    v_qualite varchar; 
    v_groupe varchar;
    v_orientation varchar; 
    v_resultat_final varchar; 
    v_id_people integer;
    v_numero_localisa integer;
    v_date_debut date;
    v_date_fin date;
    BEGIN
        FOR v_email_ad, v_email_perso, v_annee_academique, v_email_ordre, v_classe, v_matric_rs, v_numero, v_statut, v_qualite, v_groupe, v_orientation, v_resultat_final, v_id_people, v_numero_localisa,v_date_debut,v_date_fin
        IN SELECT email_ad, email_perso, annee_academique, email_ordre, classe, matric_rs, numero, statut, qualite, groupe, orientation, resultat_final, id_people, numero_localisa,date_debut,date_fin
        FROM brain.etudiants_update
        LOOP
            INSERT INTO brain.etudiants (email_ad, email_perso, annee_academique, email_ordre, classe, matric_rs, numero, statut, qualite, groupe, orientation, resultat_final,id_people,numero_localisa,date_debut,date_fin) 
                VALUES(v_email_ad, v_email_perso, v_annee_academique, v_email_ordre, v_classe, v_matric_rs, v_numero, v_statut, v_qualite, v_groupe, v_orientation, v_resultat_final, v_id_people,v_numero_localisa,v_date_debut,v_date_fin)
                ON CONFLICT ON CONSTRAINT update_id_student DO UPDATE SET 
                email_ad = excluded.email_ad, 
                email_perso = excluded.email_perso, 
                classe =  excluded.classe, 
                statut = excluded.statut, 
                qualite = excluded.qualite,
                groupe = excluded.groupe, 
                orientation = excluded.orientation, 
                resultat_final = excluded.resultat_final,
                id_people = excluded.id_people,
                numero_localisa = excluded.numero_localisa,
                date_debut = excluded.date_debut,
                date_fin = excluded.date_fin;
        END LOOP;
        truncate table only brain.etudiants_update restart identity cascade;
    return true;
    END

Ce que je ne comprend pas c'est que cette fonction à une influence sur mon id serial et que celui-ci atteint des nombres grandiose.
Auriez-vous une piste pour arrêter ce phénomène ?

D'avance merci/

#8 PL/Python » Return de valeur sur une clé composite [PG 10] » 05/02/2019 17:06:53

maitrepylos
Réponses : 0

Bonjour,

J'ai créé le type suivant :

CREATE TYPE proeco AS (
	nom text,
	prenom text,
	matricule int4,
	hash text);

Ensuite je crée la fonction suivante :

DROP FUNCTION test();
CREATE  FUNCTION test() RETURNS SETOF proeco AS $$
rv = plpy.execute("SELECT nom,prenom,matricule,hash FROM users")
d  = rv.nrows();
if d > 1:
	return rv[0:5]
	
nom = "toto";
prenom = "toto";
matricule = 123;
hash = "hash";

return (nom,prenom,matricule,hash)

$$ LANGUAGE plpythonu;

Cela fonctionne dans souci, mais lorsque c'est vide, j'ai l"erreur suivante, pourtant il me semble être cohérent par rapport à la doc https://docs.postgresql.fr/10/plpython-data.html

voici le message d'erreur :

Query execution failed

Motif:
SQL Error [22P02]: ERROR: malformed record literal: "toto"
  Détail : Missing left parenthesis.
  Où : while creating return value
PL/Python function "test"

Merci de votre aide.

Pied de page des forums

Propulsé par FluxBB