Dotaz na konkretni vyuziti RULE v PG 7.1.3
Karel Zak
zakkr na zf.jcu.cz
Pátek Únor 1 11:49:30 CET 2002
On Fri, Feb 01, 2002 at 09:52:48AM +0100, Otakar Kleps wrote:
> Dobry den,
>
> potreboval bych provest automaticky inkrement pri provadeni SQL
> selectu(nechce se mi to provadet na urovni aplikace).
> Tedy neco ve smyslu (je to samozrejme spatne ;-):
>
> CREATE RULE rule_xyz AS ON select TO tbl_xyz DO UPDATE col_inc=col_inc+1;
To je problem. Duvodem je to, ze to chcete u selectu. Prvni vec je,
ze rule "ON SELECT" musi mit definovany ten dotaz (ve vasem pripade
update) jako INSTEAD protoze on to vnitrne predela na VIEW. Tedy
CREATE RULE xxx_r AS ON SELECT TO xxx DO INSTEAD
SELECT a, b, c FROM xxx;
je stejne jako:
CREATE VIEW xxx_v AS SELECT a, b, c FROM xxx;
Dalsi problem je, ze v ON SELECT nejsou pristupne veci jako je
old/new.
Asi bych se to snazil resit nejakou funkci:
CREATE TABLE tab (id int, data text, counter int DEFAULT 0);
SELECT * FROM tab;
id | data | counter
----+------+---------
1 | aaa | 0
3 | ccc | 0
2 | bbb | 1
CREATE FUNCTION upd_counter(int) RETURNS int AS
'UPDATE tab SET counter=counter+1 WHERE id = $1;
SELECT 1'
LANGUAGE 'SQL';
SELECT id, data, upd_counter(id) FROM tab WHERE data='xxx';
Je-li to pro vas efektivni postup necham na vas a vasi aplikaci:-)
IMHO vsude tam kde je predpoklad, ze ten select vrati vice jak 1
radku to moc efektivni neni, protoze samostatnym dotazem UPDATE se
stejnou podminkou WHERE dosahnete vetsi rychlosti nez v tomto pripade
kdy pro kazde 'id' je proveden update (v te funkci) samostatne.
Karel
--
Karel Zak <zakkr na zf.jcu.cz>
http://home.zf.jcu.cz/~zakkr/
C, PostgreSQL, PHP, WWW, http://docs.linux.cz, http://mape.jcu.cz
Další informace o konferenci Databases