我正在开发一个触发器,根据另一个表中多行的数据在一个表中创建新行。
基本上,我一次得到一堆行,其中一些包含我需要进入表“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/