Re: update avec un where = false

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
>
>
>

In response to

Responses

Browse pgsql-fr-generale by date

  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