Обсуждение: INSERT RULE

Поиск
Список
Период
Сортировка

INSERT RULE

От
Pailloncy Jean-Gérard
Дата:
Hi,

I test a configuration where one table is divided in 256 sub-table.
And I use a RULE to offer a single view to the data.

For INSERT I have create 256 rules like:
CREATE RULE ndicti_000 AS ON INSERT TO ndict
     WHERE (NEW.word_id & 255) = 000 DO INSTEAD
     INSERT INTO ndict_000 VALUES( NEW.url_id, 000, NEW.intag);
CREATE RULE ndicti_001 AS ON INSERT TO ndict
     WHERE (NEW.word_id & 255) = 001 DO INSTEAD
     INSERT INTO ndict_001 VALUES( NEW.url_id, 001, NEW.intag);
And that works, a bit slow.

I try to do:
CREATE RULE ndicti AS ON INSERT TO ndict
     DO INSTEAD INSERT INTO 'ndict_' || (NEW.word_id & 255)
     VALUES( NEW.url_id, NEW.word_id, NEW.intag);
I got an error on 'ndict_' .
I did not found the right syntax.

Any help is welcomed.


Cordialement,
Jean-Gérard Pailloncy

Re: INSERT RULE

От
Pailloncy Jean-Gérard
Дата:
> I try to do:
> CREATE RULE ndicti AS ON INSERT TO ndict
>     DO INSTEAD INSERT INTO 'ndict_' || (NEW.word_id & 255)
>     VALUES( NEW.url_id, NEW.word_id, NEW.intag);
> I got an error on 'ndict_' .
> I did not found the right syntax.
In fact I discover that
SELECT * FROM / INSERT INTO table
doesn't accept function that returns the name of the table as table,
but only function that returns rows....

I'm dead.

Does this feature, is possible or plan ?
Is there a trick to do it ?

Cordialement,
Jean-Gérard Pailloncy


Re: INSERT RULE

От
Richard Huxton
Дата:
Pailloncy Jean-Gérard wrote:
>> I try to do:
>> CREATE RULE ndicti AS ON INSERT TO ndict
>>     DO INSTEAD INSERT INTO 'ndict_' || (NEW.word_id & 255)
>>     VALUES( NEW.url_id, NEW.word_id, NEW.intag);
>> I got an error on 'ndict_' .
>> I did not found the right syntax.
>
> In fact I discover that
> SELECT * FROM / INSERT INTO table
> doesn't accept function that returns the name of the table as table, but
> only function that returns rows....
>
> I'm dead.
>
> Does this feature, is possible or plan ?
> Is there a trick to do it ?

You could call a plpgsql function and inside that use EXECUTE (or use
pltcl or some other interpreted language).

Not sure what you're doing will help you much though. Are you aware that
you can have partial indexes?

CREATE INDEX i123 ON ndict WHERE (word_id & 255)=123;

That might be what you're after, but it's difficult to be sure without
knowing what problem you're trying to solve.
--
   Richard Huxton
   Archonet Ltd