Domanda

Ho un postgreSQL prima di inserire il trigger su creare che fondamentalmente reindirizza gli inserti in sottocavibili. Una volta che ho inserito il record, voglio interrompere la richiesta in cui evitare i dati duplicati (non inserendo in tabella dei genitori) in modo che sto usando il rimedio null nel trigger. Il problema è che ho bisogno del record da restituire, quindi posso ottenere l'ID. Se restituisco null, ottengo null.

Il problema di cui sopra è discusso al link sotto: Trigger postgresql non restituire nulla

Una delle risposte dice di inserire nella tabella dei genitori (non restituendo NULL ma tornando nuovo) e utilizzare dopo il trigger inserito per eliminarlo dalla tabella dei genitori. Ma sto guardando 1000 scritture al secondo e questo può essere un grave problema sulla performance a causa dei cancellati. C'è qualche altro modo per farlo?

Per essere esatti c'è un modo per restituire l'ID di una riga inserita senza inserire nella tabella dei genitori e cancellarlo in seguito.

È stato utile?

Soluzione

Ho scritto La risposta che ti riferisci a . Come ho già accennato laggiù:

.

Puoi anche usare un RULE ... INSTEAD .. per questo scopo.

RULE

Regole può essere complicato. Preferirei usare i trigger dove possibile. Assicurati di leggere un bit , prima di provare questo:

CREATE OR REPLACE RULE tbl_ins AS
ON INSERT TO tbl
DO INSTEAD
INSERT INTO tbl2 (col1, col2, ...)  -- just do mention columns where ...
VALUES (NEW.col1, NEW.col2, ...)    -- ... you want to insert column defaults
RETURNING tbl2.*
.

che restituirebbe i valori da tbl2 evitando le righe Phantom. Comunale , per documentazione su CREATE RULE :

.

In regola per INSERT, UPDATE o DELETE su una vista, è possibile aggiungere a RETURNING clausola che emette le colonne della vista. Questa clausola sarà utilizzato per calcolare le uscite se la regola viene attivata da un INSERT RETURNING, UPDATE RETURNING o DELETE RETURNING Comando rispettivamente. Quando la regola viene attivata da un comando senza RETURNING, la regola La clausola RETURNING verrà ignorata. L'attuale implementazione consente Solo le regole di INSTEAD incondizionate per contenere RETURNING;

GRAUARD Enfasi Miniera.
Dato che menziona sub-tables, lo prendo avresti bisogno di condizioni per distribuire gli inserti ...

generacodictagcode / currval()

Se si utilizza con un trigger lastval() è possibile recuperare facilmente valori appropriati da sequenze con FOR EACH ROW / currval(). La parte difficile è quella di restituire quei valori da una funzione di trigger. Posso solo pensare di scrivere a un tavolo temporaneo. Ha bisogno di un po 'di pensare quando creare e quando cadere quello ...

Avrei probabilmente ripensare l'intero approccio e reindirizza i dati su più istruzioni generatori di generazioneGode alle tabelle di destinazione effettiva ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top