使用触发器从行生成一行

Generating a row from rows with a trigger

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

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

我在这方面来回反复,但我不断收到很多错误,包括 ifs、插入和更新。似乎唯一能正常工作的是设置@info 值。

Table 内门:

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         

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

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

这个table是由wordpress数据库自动生成的。 我从创建到此 table 的表单中获取信息,其中表单上的字段的 "meta_key" 值为 "nem_nafn"、"nem_email" 或 "nem_kennitala"。

我需要上面 table 中的这些信息,其中 "meta_value" 插入到与此 "meta_key"(s) 对应的字段中。

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

哦,我需要的信息总是按照这个顺序:姓名 > 电子邮件 > 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" table,但前提是相关的 "meta_key" 进入 table "meta_value"放在 "nemendur" table.

我得到的所有错误都是#1064,"Check the manual that corresponds with your NariaDB server version for the right syntax"。此时它在第 7 行表示,即 "IF" 语句。

提前致谢, 怪人

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

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 $$

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