Bonjour,
j'utilise LAST_INSERT_ID pour récuperer le dernier ID insérer dans une table. Existe t-il une fonction similaire pour DELETE du style LAST_DELETE_ID ?
Merci
Version imprimable
Bonjour,
j'utilise LAST_INSERT_ID pour récuperer le dernier ID insérer dans une table. Existe t-il une fonction similaire pour DELETE du style LAST_DELETE_ID ?
Merci
Essaye
Et tu choisis la colonne qui contient ton id pour mettre dans "lenomdemacolonne"Code:
1
2 DELETE FROM matable WHERE macondition RETURNING "lenomdemacolonne"
Merci pour l'info mais j'ai une petite question. En effet je souhaite concaténer deux requêtes et donc je ne vois pas comment utiliser ce que tu m'indiques :
En faites je dois récupérer l'id de matable1 pour l'utiliser dans matable2 donc je ne vois pas avec ta solution comment cela fonctionne.
mais la je ne vois pas comment avec RETURNING ?Code:DELETE FROM matable1 where blabla="toto@liv.fr";DELETE FROM matable2 where="id de matable1;
Merci
Non en effet, ça ne passe pas facilement car ton premier DELETE peut retourner plus d'un id.
Tu peux peut-être essayer un truc comme ça:
PuisCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 CREATE LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION proc_mon_delete ( _machaine character varying, OUT ok character ) RETURNS character AS $$ DECLARE __id record; BEGIN "ok" := CAST('ko' AS character(2)); FOR __id IN DELETE FROM matable1 WHERE "blabla" = _machaine RETURNING "id1" LOOP DELETE FROM matable2 WHERE "id2" = __id."id1"; END LOOP; "ok" := CAST('ok' AS character(2)); RETURN; END $$ LANGUAGE plpgsql;
ça fait peut-être un peu artillerie lourde, mais au moins tu peux faire ce que tu veux, y compris ajouter la gestion d'exceptions et faire du ROLLBACK.Code:
1
2 SELECT * FROM proc_mon_delete('toto@liv.fr');
Merci a toi pour cette aide. J'ai besoin si tu peux que tu m'explique un peu. je suis obligé de faire un select pour chaque ligne c'est ça?
C'est pour utiliser depuis un script shell donc puis je utiliser utiliser ta fonction dans une variable comme suit :
puisCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 MAVARIABLE="CREATE LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION proc_mon_delete ( _machaine character varying, OUT ok character ) RETURNS character AS $$ DECLARE __id record; BEGIN "ok" := CAST('ko' AS character(2)); FOR __id IN DELETE FROM matable1 WHERE "blabla" = _machaine RETURNING "id1" LOOP DELETE FROM matable2 WHERE "id2" = __id."id1"; END LOOP; "ok" := CAST('ok' AS character(2)); RETURN; END $$ LANGUAGE plpgsql;"
MerciCode:SELECT * FROM $MAVARIABLE('toto@liv.fr');
Non en fait, tu commence par définir un nouveau langage (le plpgsql) en faisantEnsuite tu crée ta fonction. Tu n'as pas besoin de créer tout ça à partir de ton script, sauf si il s'occuppe également de la création de ta base de données et de ses tables.Code:CREATE LANGUAGE plpgsql;
Puis enfin, tu peux l'appeler autant de fois que tu le souhaiteras depuis ton script en faisantCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 CREATE OR REPLACE FUNCTION proc_mon_delete ( _machaine character varying, OUT ok character ) RETURNS character AS $$ DECLARE __id record; BEGIN "ok" := CAST('ko' AS character(2)); FOR __id IN DELETE FROM matable1 WHERE "blabla" = _machaine RETURNING "id1" LOOP DELETE FROM matable2 WHERE "id2" = __id."id1"; END LOOP; "ok" := CAST('ok' AS character(2)); RETURN; END $$ LANGUAGE plpgsql;
cette ligne exécutera le code se trouvant dans ta fonction 'proc_mon_delete'.Code:SELECT * FROM proc_mon_delete('toto@liv.fr');
Ta fonction commencera d'abord par exécuter la requête suivante:
Puis pour tous les "id" retournés, elle exécutera la ligne:Code:DELETE FROM matable1 WHERE "blabla" = 'toto@liv.fr' RETURNING "id"
Code:DELETE FROM matable2 WHERE "id2" = "id";
Merci cela commence a être plus clair mais j'ai encore une interrogation . Je cite :
Ou dois je crée la fonction. Dans mon script shell, un script autre et comment appeler cette fonction dans mon script shell.Citation:
Ensuite tu crée ta fonction. Tu n'as pas besoin de créer tout ça à partir de ton script
Merci
En fait, tu crée ta fonction directement dans ta base, de la même manière que tu as créé tes tables en base (donc depuis ton PHPPgAdmin, ou PgAdminIII ou ta console psql ou même depuis un simple script) :)
Une fois qu'elle est en base, elle y reste une fois pour toutes!
Ensuite, l'appel à la fonction est considéré comme un simple SELECT en SQL, donc tu peux l'exécuter depuis ton script, tout comme tu voulais le faire avec tes DELETE.
Ah ok je crois avoir compris, je dois crée un trigger.
Merci
ok cool merci beaucoup avec tout cela je penses pourvoir me dépatouiller. Par curiosité sais tu si cela fonctionne sous Mysql aussi ?
:ccool:
Non, sous MySQL tu dois écrire ta procédure différemment.
De plus, le plpgsql n'existant pas, tu devras l'écrire en SQL.
Et pour l'appeler ça sera:
Code:call mabase.proc_mon_delete('toto@liv.fr');