【问题标题】:Creating a trigger to copy data from 1 table to another创建触发器以将数据从一个表复制到另一个表
【发布时间】:2018-07-18 11:30:46
【问题描述】:

我正在尝试创建一个触发器,当新条目已放入表 1 时,它将从表 1 复制数据并将其粘贴到表 2:

Table 1  

id | first_name | last_name | email | uid | pwd 
----+------------+-----------+-------+-----+-----


Table 2 

user_id | user_first_name | user_last_name | user_uid 
---------+-----------------+----------------+---------

我使用的代码是这样的:

DROP TRIGGER IF EXISTS usersetup_identifier ON users;

CREATE OR REPLACE FUNCTION usersetup_identifier_insert_update() RETURNS trigger AS $BODY$
BEGIN
    if NEW.identifier is null then
        NEW.identifier := "INSERT INTO users_setup (user_id, user_first_name, user_last_name, user_uid)
                          SELECT id, first_name, last_name, uid 
                          FROM users";
    end if;
RETURN NEW;
end
$BODY$
 LANGUAGE plpgsql;

CREATE TRIGGER usersetup_identifier
    AFTER INSERT OR UPDATE ON users FOR EACH ROW
    EXECUTE PROCEDURE usersetup_identifier_insert_update();

但是当我将数据插入表 1 时,我收到此错误消息:

NOTICE:  identifier "INSERT INTO users_setup (user_id, user_first_name, user_last_name, user_uid)
                          SELECT id, first_name, last_name, uid 
                          FROM users" will be truncated to "INSERT INTO users_setup (user_id, user_first_name, user_last_na"
ERROR:  record "new" has no field "identifier"
CONTEXT:  SQL statement "SELECT NEW.identifier is null"
PL/pgSQL function usersetup_identifier_insert_update() line 3 at IF

表格说明如下:

                                     Table "public.users"
       Column   |     Type      | Collation | Nullable |              Default              
    ------------+---------------+-----------+----------+-----------------------------------
     id         | integer       |           | not null | nextval('users_id_seq'::regclass)
     first_name | character(20) |           | not null | 
     last_name  | character(20) |           | not null | 
     email      | character(60) |           | not null | 
     uid        | character(20) |           | not null | 
     pwd        | character(20) |           | not null | 
    Indexes:
        "users_pkey" PRIMARY KEY, btree (id)
        "users_email_key" UNIQUE CONSTRAINT, btree (email)
        "users_pwd_key" UNIQUE CONSTRAINT, btree (pwd)
        "users_uid_key" UNIQUE CONSTRAINT, btree (uid)
    Triggers:
        usersetup_identifier AFTER INSERT OR UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE usersetup_identifier_insert_update()

所有的列都匹配那里对应的列 谁能帮忙告诉我哪里出错了?

                                            Table "public.users_setup"
         Column      |          Type          | Collation | Nullable |                 Default                 
    -----------------+------------------------+-----------+----------+-----------------------------------------
     id              | integer                |           | not null | nextval('users_setup_id_seq'::regclass)
     user_id         | integer                |           |          | 
     user_first_name | character(20)          |           |          | 
     user_last_name  | character(20)          |           |          | 
     user_uid        | character(20)          |           |          |

谁能帮我解决我哪里出错了?

【问题讨论】:

  • 请定义用户表。还有你想如何使用“new.identifier”?..
  • 如果你真的想运行一个插入语句,你为什么要给new.identifier分配一个新值?另外:双引号用于标识符。字符串常量需要用单引号括起来"foo"是一个名字(例如一个表名),'foo'是字符常量
  • 这两个表中都没有identifier 列。
  • 我是新手,所以还在学习我把新的标识符放在我找到的一个例子中。如果我不需要这个我该怎么写?

标签: sql postgresql plpgsql database-trigger


【解决方案1】:

您的代码中有多个错误

  1. users 有一个名为identifier 的列,因此表达式NEW.identifier 无效
  2. 您正在使用表达式 new.identifier := ... 为(不存在的)列赋值 - 但您想要运行 INSERT 语句,而不是赋值。
  3. 字符串值需要用单引号括起来,例如'Arthur',双引号表示标识符(例如表或列名)。但是没有名为"INSERT INTO use ..."的列

要访问插入行的值,您需要使用new 记录和列名。无需从表中选择

据我所知,这就是你想要的:

CREATE OR REPLACE FUNCTION usersetup_identifier_insert_update() 
   RETURNS trigger 
AS 
$BODY$
BEGIN
    INSERT INTO users_setup (user_id, user_first_name, user_last_name, user_uid)
    values (new.id, new.first_name, new.last_name, new.uid);
    RETURN NEW;
end
$BODY$
 LANGUAGE plpgsql;

不相关,但是:

像这样复制数据是糟糕的数据库设计。如果更改用户名会发生什么?然后你还需要UPDATE user_setup 表。最好只在引用users 表的user_setup 表中存储一个(外键)引用。

【讨论】:

  • 谢谢你,因为用户名不会改变,所以我现在需要做的,但如果改变,我会考虑做一个外键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2017-05-17
  • 2014-02-06
相关资源
最近更新 更多