【问题标题】:Assign a constant value in a trigger function在触发函数中分配一个常数值
【发布时间】:2014-03-07 11:10:44
【问题描述】:

我正在学习 PostgreSQL 中的触发器。

我已经创建了一个触发函数update_name()

CREATE OR REPLACE FUNCTION update_name()
RETURNS trigger AS
$BODY$
BEGIN
    NEW.name := "ankit";
    RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION update_name()
  OWNER TO postgres;

我的表user_table是:

CREATE TABLE user_table (
  name character varying(20) NOT NULL,
  password character varying(20),
  email character varying(20),
  gender character varying(20),
  phone bigint,
  CONSTRAINT user_table_pkey PRIMARY KEY (name)
);

表格的触发器是:

CREATE TRIGGER "change-name"
BEFORE INSERT OR UPDATE
  ON user_table
  FOR EACH ROW
  EXECUTE PROCEDURE update_name();

当我使用查询向表中插入数据时:

INSERT INTO user_table(name, password, email, gender, phone)
VALUES ('aa', '9874', 'poi@ka.in', 'male', 8978987896);

我遇到了错误:

ERROR:  column "ankit" does not exist
LINE 1: SELECT "ankit"
               ^
QUERY:  SELECT "ankit"
CONTEXT:  PL/pgSQL function update_name() line 3 at assignment

********** Error **********

ERROR: column "ankit" does not exist
SQL state: 42703
Context: PL/pgSQL function update_name() line 3 at assignment

我做错了什么?

【问题讨论】:

    标签: sql postgresql syntax triggers quotes


    【解决方案1】:

    这是关于 PostgreSQL 语法的。我从问题中删除了对 pgAdmin 的不相关引用。

    在 Postgres 中,文字值(常量)用单引号括起来:'value'
    双引号保留用于标识符,但只要它包含合法的小写字母,则可选:"Odd Name"odd_name

    这也是 SQL 标准。从阅读"Lexical Structure" in the manual 章节开始。

    【讨论】:

      【解决方案2】:

      仅仅改变了错误就消失了:

      NEW.name := "ankit";
      

      NEW.name := 'ankit';
      

      为什么会这样???

      【讨论】:

      • 为什么会这样? - 因为这就是 SQL 的工作方式。标识符使用双引号引起来,字符串常量使用单引号。
      【解决方案3】:
      CREATE OR REPLACE FUNCTION update_name()
      RETURNS trigger AS
      $BODY$
          BEGIN
           RAISE NOTICE 'RECORD IS INSERTED %',NEW.name;
                  INSERT INTO user_table VALUES("ankit",NEW.password,NEW.email,NEW.gender,NEW.phone);
                  RETURN NEW;
              end if;
      END;
      $BODY$
        LANGUAGE plpgsql VOLATILE
        COST 100;
      ALTER FUNCTION update_name()
        OWNER TO postgres;
      

      试试这个对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-04
        • 1970-01-01
        • 2012-06-28
        • 2022-10-21
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 2018-11-18
        相关资源
        最近更新 更多