mysql - 使用触发器从行生成行

标签 mysql wordpress database-trigger

我正在开发一个触发器,根据另一个表中多行的数据在一个表中创建新行。

基本上,我一次得到一堆行,其中一些包含我需要进入表“nemendur”(学生)的用户信息。

我已经反复讨论过这个问题,但我不断收到很多错误,包括 if、插入和更新。似乎唯一正常工作的是设置 @info 值。

表nemendur:

ID           int PK AI not null 
nafn         varchar not null   (name of student)
email        varchar            (email of student)
kennitala    varchar            (SSN)
post_id      int unique         

表 uppl(upplýsingar 或信息的缩写):

meta_id      int AUTO INCREMENT PRIMARY KEY NOT NULL     
post_id      int
meta_key     varchar
meta_value   TEXT

该表是由wordpress数据库自动生成的。 我从我在该表中创建的表单中获取信息,其中表单上的字段的“meta_key”值为“nem_nafn”、“nem_email”或“nem_kennitala”。

我需要上表中的这些信息,其中“meta_value”插入到与此表中的“meta_key”对应的字段中。

我认为这是一个非常简单的代码,但如果不够清楚,请告诉我,以便我可以更好地解释它。

哦,我需要的信息始终按此顺序排列:姓名 > 电子邮件 > SSN。这与此代码如何工作相关(如果名称出现在最后,则其他两个将没有要更新的行)。

drop trigger if exists p;
delimiter $$
create trigger p
AFTER INSERT ON uppl 
FOR EACH ROW

begin

SET @info = 
(
    SELECT meta_value
    WHERE post_id = NEW.post_id && meta_key = 'nem_name'
);

IF @info IS NOT NULL THEN

    INSERT INTO nemendur(id, nafn, email, kennitala, post_id)
    VALUES
    ('', @info, '', '', NEW.post_id);
ELSE
    SET @info = 
    (SELECT meta_value
    WHERE post_id = NEW.post_id && meta_key = 'nem_email');

    IF @info IS NOT NULL THEN

        UPDATE nemendur
        SET email = @info
        WHERE post_id = NEW.post_id;

    ELSE

        SET @info = (SELECT meta_value
                WHERE post_id = NEW.post_id && meta_key = 'nem_kennitala');

        if @info IS NOT NULL THEN

            UPDATE nemendur
            SET kennitala = @info
            WHERE post_id = NEW.post_id;
        end if;
    end if;
end if;

end $$
delimiter $$

总结:一堆行进入“uppl”表,但只有当具有相关“meta_key”的行进入该表时,“meta_value”才会放入“nemendur”表中。

我收到的所有错误都是#1064,“检查与您的 NariaDB 服务器版本对应的手册以获取正确的语法”。此时它在第7行,即“IF”语句。

提前致谢, 奇怪的家伙

最佳答案

在不需要的地方有括号,在应该有的地方缺少括号,并且缺少结尾 if 的楔形。

drop procedure if exists p;
delimiter $$
create procedure p()
begin
SET @info = 
(
    SELECT meta_value
    WHERE post_id = NEW.post_id && meta_key = 'nem_name'
);

IF @info IS NOT NULL THEN

    INSERT INTO nemendur(id, nafn, email, kennitala, post_id)
    VALUES
    ('', @info, '', '', NEW.post_id);
ELSE
    SET @info = 
    (SELECT meta_value
    WHERE post_id = NEW.post_id && meta_key = 'nem_email');

    IF @info IS NOT NULL THEN

        UPDATE nemendur
        SET email = @info
        WHERE post_id = NEW.post_id;

    ELSE

        SET @info = (SELECT meta_value
                WHERE post_id = NEW.post_id && meta_key = 'nem_kennitala');

        if @info IS NOT NULL THEN

            UPDATE nemendur
            SET kennitala = @info
            WHERE post_id = NEW.post_id;
       end if;
   end if;
end if;

end $$
delimiter $$

注意我知道这是一个程序...

关于mysql - 使用触发器从行生成行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50969234/

相关文章:

Mysql Mariadb 递归查询

php - 创建一个 INDEX 以改善由 ORDER BY 导致的缓慢执行时间

css - Genesis Wordpress 框架中的整页横幅?

wordpress - 如何仅使用 wp_query 获取特定子类别帖子

c++ - 如何使用 QT 和 C++ 监听 mysql 数据库中的触发事件?

php - 将 foreach 值添加到 Ajax

mysql - 如何在 shell 脚本文件的 MySQL 查询中嵌入 BASH 变量

wordpress - 伪关键帧动画不起作用

MySQL触发不同数据库不同服务器

postgresql - PL/pgSQL : How to use IF NEW. <variable_column_name> <> OLD.<variable_column_name>