在 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" ....
我一直试图在网上找到这个,但我是 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
:
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" ....