1) You attached users_code_seq() to a trigger on the users table.
yes
2) You have a where clause: company_id = NEW.id3) NEW refers to users4) NEW.id is obstensibly a USER ID
No...
CREATE OR REPLACE FUNCTION users_code_seq()
RETURNS "trigger" AS $$
DECLARE code character varying;
BEGIN
IF (TG_OP = 'INSERT') THEN
UPDATE public.companies SET client_code_increment = (client_code_increment + 1) WHERE id = NEW.id;
END IF;
IF NEW.code IS NULL THEN
SELECT client_code_increment INTO NEW.code FROM public.companies as c WHERE c.id = NEW.id ORDER BY client_code_increment DESC;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
I'm updating the companies table... The company table has a column called ID.
If I change that to company_id, I get the error: column "company_id" does not exist, because that column is inside USERS and not COMPANIES.
So as far as I can see here, that command is right.
- If I'm wrong, please, explain to me.
5) So you are basically saying: WHERE company_id = user_id6) If you were to get match it would be entirely by accident - say because you used the same integer for both id values
Just to be clear here:
1 -
ALTER TABLE public.companies ADD COLUMN client_code_increment integer;
ALTER TABLE public.companies ALTER COLUMN client_code_increment SET NOT NULL;
ALTER TABLE public.companies ALTER COLUMN client_code_increment SET DEFAULT 1000;
2 -
CREATE OR REPLACE FUNCTION users_code_seq()
RETURNS "trigger" AS $$
DECLARE code character varying;
BEGIN
IF (TG_OP = 'INSERT') THEN
UPDATE public.companies SET client_code_increment = (client_code_increment + 1) WHERE company_id = NEW.id;
END IF;
IF NEW.code IS NULL THEN
SELECT client_code_increment INTO NEW.code FROM public.companies as c WHERE c.id = NEW.id ORDER BY client_code_increment DESC;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
3 -
CREATE TRIGGER tf_users_code_seq
BEFORE INSERT
ON public.users
FOR EACH ROW
EXECUTE PROCEDURE users_code_seq();