在 Postgresql 的函数中遵循外键

Follow foreign key in function in Postgresql

我一直试图在网上找到这个,但我是 postgresql 的新手,我可能不太了解快速过滤出搜索结果..

我已经声明了下表:

CREATE SEQUENCE country_id_seq;

CREATE TABLE country
(
  id integer NOT NULL DEFAULT nextval('country_id_seq'),
  name character varying(40) NOT NULL,
  CONSTRAINT country_pkey PRIMARY KEY (id)
);

CREATE SEQUENCE user_id_seq;

CREATE TABLE user
(
  id integer NOT NULL DEFAULT nextval('user_id_seq'),
  first_name character varying(40) NOT NULL,
  last_name character varying(40) NOT NULL,
  country_id integer NOT NULL,
  CONSTRAINT user_pkey PRIMARY KEY (id),
  CONSTRAINT user_fk_country_id FOREIGN KEY (country_id)
      REFERENCES country (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED
);

现在我想在 USER 上创建一个触发函数(出于示例目的)引发国家名称

的异常
CREATE FUNCTION trigger_user_deny() RETURNS trigger AS $$
BEGIN
    RAISE EXCEPTION 'STUFF %', NEW.country_id.name;
  RETURN NEW;
END
$$
LANGUAGE plpgsql;

CREATE TRIGGER trigger_user_deny_insert
  BEFORE INSERT
  ON customer
  FOR EACH ROW
  EXECUTE PROCEDURE trigger_user_deny();

所以基本上我的问题是:我如何做类似 NEW.country_id.name 的事情(这不起作用,目的是 select country.name from country where id=NEW.country_id)?

问题不是很清楚,但我想你想要的是id = "user".country_id所在国家的名称。 在这种情况下,您必须使用 table user:

中的新值查询 table country
CREATE or replace FUNCTION trigger_user_deny() RETURNS trigger AS $$
BEGIN

    RAISE EXCEPTION 'STUFF %', name from country WHERE id = NEW.country_id;
  RETURN NEW;
END
$$
LANGUAGE plpgsql;

PS:如果你命名一个 table user,这是 PostgreSQL 关键字,你必须总是在查询和其他 sql 语句中用双引号引起来:

CREATE TABLE "user" ....