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 26/03/2021 21:12:50

Rizcola62
Membre

trigger erreur insert types de données

CREATE TABLE aappma
(
    id smallint,
    geom geometry(MultiPolygon,2154),
    aappma character varying(254),
    nom character varying(254)
)
CREATE TABLE emp_aappma
(
    id_emp bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( CYCLE INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
    emp boolean NOT NULL,
    id_aappma smallint,
)
CREATE OR REPLACE FUNCTION id_aappma() RETURNS trigger AS $emp_id_aappma$
    BEGIN
	NEW.id_aappma = (select id from aappma where aappma = NEW.id_aappma);
    END;
$emp_id_aappma$ LANGUAGE plpgsql;
CREATE TRIGGER id_aappma BEFORE INSERT OR UPDATE ON emp_aappma
    FOR EACH ROW EXECUTE FUNCTION id_aappma();
INSERT INTO emp_aappma (emp,id_aappma) VALUES (false, 'Ablette')
ERREUR : ERREUR:  syntaxe en entrée invalide pour le type smallint : « Ablette »

voilà le but est lorsque j'envoie la chaine 'Ablette' le déclencheur retourne l'id associé via un select sur une autre table
cependant insérer une valeur de type chaine dans un champ type integer, c'est pas top.
comment contourner ce problème?
avez vous des idées?

Hors ligne

#2 26/03/2021 21:53:23

Re : trigger erreur insert types de données

Rizcola62 a écrit :

voilà le but est lorsque j'envoie la chaine 'Ablette' le déclencheur retourne l'id associé via un select sur une autre table
cependant insérer une valeur de type chaine dans un champ type integer, c'est pas top.
comment contourner ce problème?
avez vous des idées?

Faire une vue qui a un id_aappma text ; et un trigger INSTEAD OF INSERT  ?

Dernière modification par herve.lefebvre (26/03/2021 21:53:45)

Hors ligne

#3 26/03/2021 23:10:32

gleu
Administrateur

Re : trigger erreur insert types de données

Mon idée, c'est qu'il faut mieux expliquer votre problème parce que ça ne veut absolument rien dire. "Envoyer la chaîne" n'a aucun sens en SQL. Insérer une chaîne dans un champ de type integer est impossible, et il est impossible de détourner ça en SQL pour faire autre chose. À la rigueur, c'est possible dans une routine (par exemple en PL/pgsql) mais c'est le seul contournement possible.

Bref, expliquer mieux ce que vous voulez faire parce que c'est vraiment pas clair.


Guillaume.

Hors ligne

#4 27/03/2021 01:47:24

Rizcola62
Membre

Re : trigger erreur insert types de données

gleu a écrit :

Mon idée, c'est qu'il faut mieux expliquer votre problème parce que ça ne veut absolument rien dire. "Envoyer la chaîne" n'a aucun sens en SQL. Insérer une chaîne dans un champ de type integer est impossible, et il est impossible de détourner ça en SQL pour faire autre chose. À la rigueur, c'est possible dans une routine (par exemple en PL/pgsql) mais c'est le seul contournement possible.

Bref, expliquer mieux ce que vous voulez faire parce que c'est vraiment pas clair.

oui pas de problème,
TABLE aappma
id, aappma
1, Ablette
INSERT INTO emp_aappma (emp,id_aappma) VALUES (false, 'Ablette') => cette commande vient d'un script python via psycopg2 moulinant un csv (infos saisie par utilisateurs)
Déclenchement du TRIGGER
ce que je veux obtenir:
TABLE emp_aappma
emp, id_aappma
false,1


Faire une vue qui a un id_aappma text ; et un trigger INSTEAD OF INSERT  ?

je comprend l'idée mais je ne vois pas très bien la démarche.

Hors ligne

#5 27/03/2021 09:43:51

rjuju
Administrateur

Re : trigger erreur insert types de données

Pourquoi ne pas corriger le script python afin qu'il génère une requête SQL valide faisant la correspondance entre votre "aappma" et son identifiant ?


Si les performances sont importantes, vous pourriez également créer une table temporaire pour importer toutes les entrées de votre CSV avec un unique COPY, et mettre à jour la table comme il faut avec un unique INSERT, potentiellement une clause ON CONFLICT.

Hors ligne

#6 27/03/2021 14:24:47

Rizcola62
Membre

Re : trigger erreur insert types de données

Pourquoi ne pas corriger le script python afin qu'il génère une requête SQL valide faisant la correspondance entre votre "aappma" et son identifiant ?

oui effectivement mais dans mon cas c'est trop compliqué (j'exploite les données issue de formulaires PDF)

ok l'import de csv permet il l'action d'un trigger? du type UPDATE ou INSERT?

Dernière modification par Rizcola62 (27/03/2021 14:25:06)

Hors ligne

#7 27/03/2021 16:33:36

gleu
Administrateur

Re : trigger erreur insert types de données

L'import d'un CSV, c'est une commande COPY ou INSERT suivant le cas. Les deux peuvent déclencher un trigger. Ceci étant dit, si vous continuez à insérer une chaîne dans une colonne de type entier, vous aurez une erreur avant même que le trigger ne puisse se déclencher. Vous n'avez que deux solutions : soit vous changez le type de la colonne, soit vous insérez dans une autre table (mais cette dernière solution ne semble pas possible vu que la modification du script Python ne vous convient pas).


Guillaume.

Hors ligne

#8 28/03/2021 06:16:24

rjuju
Administrateur

Re : trigger erreur insert types de données

Je ne suis pas certain de comprendre pourquoi la modification du script python est trop compliquée.  Vous avez à un endroit une comande générant INSERT INTO emp_aappma (emp,id_aappma) VALUES (false, 'Ablette').  Il suffit de changer par un INSERT INTO ... SELECT ... FROM .... JOIN...  Cela ne devrait absolument pas changer le reste du script?

Hors ligne

#9 30/03/2021 10:43:47

Rizcola62
Membre

Re : trigger erreur insert types de données

rjuju a écrit :

Je ne suis pas certain de comprendre pourquoi la modification du script python est trop compliquée.  Vous avez à un endroit une comande générant INSERT INTO emp_aappma (emp,id_aappma) VALUES (false, 'Ablette').  Il suffit de changer par un INSERT INTO ... SELECT ... FROM .... JOIN...  Cela ne devrait absolument pas changer le reste du script?

Oui effectivement.
mais je vais rester sur une table  permettant l'import de csv brut et grâce aux triggers manipuler la donnée et l'envoyer dans les tables adéquates.
Merci pour votre aide cool

Hors ligne

Pied de page des forums