CREATE SEQUENCE "employee_number_seq" START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1; DO $$ DECLARE v_next_value INTEGER; BEGIN SELECT COALESCE(MAX(SUBSTRING(employee_no FROM 4)::INTEGER), 0) + 1 INTO v_next_value FROM employees WHERE employee_no ~ '^HYD[0-9]{6}$'; EXECUTE format('ALTER SEQUENCE "employee_number_seq" RESTART WITH %s', v_next_value); END; $$; CREATE OR REPLACE FUNCTION generate_employee_number() RETURNS TEXT LANGUAGE plpgsql AS $$ DECLARE v_seq INTEGER; BEGIN v_seq := nextval('"employee_number_seq"'); IF v_seq > 999999 THEN RAISE EXCEPTION '员工编号序列已达上限 999999'; END IF; RETURN 'HYD' || LPAD(v_seq::TEXT, 6, '0'); END; $$; ALTER TABLE "employees" ALTER COLUMN "employee_no" SET DEFAULT generate_employee_number(); CREATE OR REPLACE FUNCTION prevent_employee_no_update() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN IF OLD.employee_no IS DISTINCT FROM NEW.employee_no THEN RAISE EXCEPTION '禁止修改员工编号:employee_no 是不可变字段'; END IF; RETURN NEW; END; $$; CREATE TRIGGER prevent_employee_no_update_trigger BEFORE UPDATE ON "employees" FOR EACH ROW EXECUTE FUNCTION prevent_employee_no_update();