I have a table that looks like this:
CREATE TABLE transactions(
id SERIAL NOT NULL PRIMARY KEY,
value NUMERIC(10,3),
note TEXT,
group_id INTEGER);
I'd like to update the group ID automatically with a trigger, if it's not set on insert. So something like this:
CREATE FUNCTION trigger_update_group()
RETURNS trigger AS $$
DECLARE max_group_id_ INTEGER := 0;
BEGIN
IF NEW.group IS NULL THEN
SELECT MAX(group_id) INTO max_group_id_ FROM transactions;
max_group_id_ := 1;
NEW.group = max_group_id_;
END IF;
RETURN NEW;
END;
$$ language plpgsql;
The problem with this is that if I set the trigger to FOR EACH ROW
, then each inserted row gets a different group_id (not to mention we run the SELECT statement for each row too).
Instead, what I was hoping for was that all the rows in a given INSERT statement would get the same group_id. Is there a way to do that (even if it involves transactions)? It seems FOR EACH STATEMENT
doesn't allow access to the individual rows. Maybe there's some way to wrap the INSERT?