我想做的是在触发器上验证某个注册器的电子邮件。例如,如果客户是首次注册,则应使用名字和姓氏创建电子邮件(例如:user.last@email.com),但是如果已经有同名注册者它应该以相同的方式创建电子邮件,并在customer_id (例如:user.last2@email.com)之后使用名字和姓氏。
到目前为止,我的代码如下:
delimiter $
create trigger before_customer_insert
before insert on customer
for each row
begin
declare emailVal varchar(45);
declare checkData int;
declare checkData2 int;
set checkData = (select count(first_name) from customer where first_name = new.first_name);
set checkData2 = (select count(last_name) from customer where last_name = new.last_name);
if((checkData = 1) and (checkData2 = 1)) then
set new.email = (concat(new.first_name,'.', new.last_name, '@sakilacustomer.org'));
else
set new.email = (concat(new.first_name,'.', new.last_name, new.customer_id, '@sakilacustomer.oeg'));
end if;
if(new.kind_customer is null) then
set new.kind_customer = '1';
end if;
set new.active = 1;
end $
我遇到的问题是,当它是第一次注册时,它会插入电子邮件,但带有0,例如“ name.last0@email.com”,如果我尝试插入相同的信息,则会显示相同的电子邮件。我试图更改if语句中的逻辑,但仍然显示相同的问题。
答案 0 :(得分:0)
您的逻辑是落后的。你有:
if((checkData = 1) and (checkData2 = 1)) then
但是你想要
if((checkData = 0) and (checkData2 = 0)) then
当数据库中没有任何具有这些名称的现有记录时,您要使用不带客户ID的名称。
请注意,我不确定您是否希望分别查找名字和姓氏。您是否要检查是否按原样找到整个地址?
编写方式是,如果某个名为Joe Bloggs的人尝试加入,即使系统中没有其他名为Joe的人,即使没有其他Joe Bloggs,他也将是joe.bloggs1。