From: | "thomas(dot)silvi" <thomas(dot)silvi(at)laposte(dot)net> |
---|---|
To: | chetzacoalt(at)free(dot)fr |
Cc: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: update avec un where = false |
Date: | 2005-08-14 08:50:16 |
Message-ID: | 42FF05C8.2050602@laposte.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
santiago a écrit :
>bonjour
>
>j'aimerai ecrire un trigger pour intercepter les update qui cherchent a
>mettre a jour des lignes n'exhistant pas:
>
>du type:
>
>update table set col=3 where ccooll=2;
>-- avec aucune ligne ne repondant a ccooll=2
>
>je voudrais intercepter ca pour creer une ligne, avec ccooll=2, et le
>reste aux valeurs par defaut.
>
>y'a t-il un moyen de realiser ca ?
>
>
Hello,
via un trigger, je ne crois pas que cela soit possible.
Dans le cas ou c'est un mise a jour de une ligne avec un id donnee de
ccooll,
tu peux le faire indirectement via une procedure en plgsql
par exemple
CREATE TABLE testA
(
ccooll INT NOT NULL PRIMARY KEY,
col INT DEFAULT(1),
col2 VARCHAR(5) DEFAULT('hello')
)
;
CREATE OR REPLACE FUNCTION set_testA (INT,INT,VARCHAR(5))
RETURNS INTEGER AS '
DECLARE
v_ccooll ALIAS FOR $1;
v_col ALIAS FOR $2;
v_col2 ALIAS FOR $3;
v_error SMALLINT;
v_rowcount INT;
BEGIN
UPDATE testA
SET col = COALESCE(v_col,col),
col2 = COALESCE(v_col2,col2)
WHERE ccooll = v_ccooll;
GET DIAGNOSTICS v_rowcount = ROW_COUNT;
IF (v_rowcount = 0) THEN
INSERT INTO testA(ccooll) VALUES (v_ccooll);
UPDATE testA
SET col = COALESCE(v_col,col),
col2 = COALESCE(v_col2,col2)
WHERE ccooll = v_ccooll;
END IF;
RETURN 0;
END;
' LANGUAGE 'plpgsql';
INSERT INTO testA (ccooll) SELECT 1;
INSERT INTO testA (ccooll) SELECT 3;
donne
ccooll|col|col2
------+---+-----
1| 1|hello
3| 1|hello
(2 rows)
SELECT set_testA (1, NULL, 'world');
SELECT set_testA (3, 20, NULL);
SELECT set_testA (2, 20, NULL);
SELECT set_testA (4, NULL, 'bye');
SELECT * FROM testA;
donne
ccooll|col|col2
------+---+-----
1| 1|world
3| 20|hello
2| 20|hello
4| 1|bye
(4 rows)
Le truc du COALESCE c'est pour dire que si la valeur donne en parametre
pour la colonne x vaut NULL,
alors la colonne x est mise a jour avec la valeur de la colonne x (bref
aucun effet). Mais si la valeur donne
en parametre pour la colonne x est differente de NULL, alors la mise a
jour est bien effective. Cela permet
de faire une seule procedure.
Cela ne resout pas completement ta question dans le sens ou si il y a
un UPDATE direct sur la table avec un
id inexistant et bien la ligne ne sera jamais creee. Donc pas sur a 100%.
Bonne journee,
Thomas
>---------------------------(end of broadcast)---------------------------
>TIP 4: Have you searched our list archives?
>
> http://archives.postgresql.org
>
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | santiago | 2005-08-14 13:24:00 | Re: update avec un where = false |
Previous Message | santiago | 2005-08-12 14:19:43 | update avec un where = false |