在触发器功能中分配常量值

时间:2014-02-10 08:02:34

标签: sql postgresql syntax triggers quotes

我正在学习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();

当我使用query:

将数据插入到我的表中时
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

我做错了什么?

3 个答案:

答案 0 :(得分:1)

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

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

这也是SQL标准。首先阅读章节"Lexical Structure" in the manual

答案 1 :(得分:0)

ERROR改变了:

NEW.name := "ankit";

NEW.name := 'ankit';

为什么会这样?

答案 2 :(得分:-1)

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;

试试这个会对你有帮助。