【问题标题】:Follow foreign key in function in Postgresql在 Postgresql 中遵循函数中的外键
【发布时间】:2015-03-18 09:48:53
【问题描述】:

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

【问题讨论】:

  • NEW.country_id.name 适合你吗?它不存在于桌子上。如果您打算从国家表中获取国家名称,则必须查询该表。
  • 什么意思,桌子上不存在? country_id 是国家/地区表的 FK,国家/地区表具有名称。我认为该语句的目的对于表模式很清楚,但我可以详细说明,你是对的,对不起。

标签: postgresql function triggers foreign-keys


【解决方案1】:

这个问题不是很清楚,但我想你想要拥有id = "user".country_id 的国家的名字。 在这种情况下,您必须使用表 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:如果你命名一个表user,这是PostgreSQL关键字,你必须总是在查询和其他sql语句中双引号:

CREATE TABLE "user" ....

【讨论】:

  • 我希望 plpgsql 能够跟进 FK “ORM 风格” :) 感谢您提供关于保留关键字以及没有“SELECT”的语法的提示;我正在使用 SELECT name FROM country WHERE ... INTO myVar;然后使用 myVar :)
猜你喜欢
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 2013-08-22
  • 2012-03-05
  • 1970-01-01
  • 2014-10-15
  • 2021-12-22
  • 2021-08-28
相关资源
最近更新 更多