使用触发器从行生成一行
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 $$
注意我知道这是一个过程...
我正在开发一个触发器,根据另一行中多行的数据在一个 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 $$
注意我知道这是一个过程...