将SQL Server触发器转换为MySQL
这是原始SQL Server 2008触发器:将SQL Server触发器转换为MySQL,mysql,sql,sql-server-2008,triggers,Mysql,Sql,Sql Server 2008,Triggers,这是原始SQL Server 2008触发器: CREATE TRIGGER InsertVehTrig ON dbo.Vehicle FOR INSERT AS declare @Cph char(50), @DevID char(12), @VehID bigint, @TmpID bigint,
CREATE TRIGGER InsertVehTrig ON dbo.Vehicle
FOR INSERT AS
declare @Cph char(50),
@DevID char(12),
@VehID bigint,
@TmpID bigint,
@DevCount int
begin
set nocount on
select @Cph = rtrim(ltrim(i.cph)), @VehID = i.ID, @DevID = DevID
from inserted i
if(@VehID is null)
return select @DevCount= count(id) from vehicle where (cph=@cph) or (DevID=@DevID)
--选择记录--条件:当前的车牌号 或 设备ID
if ( @DevCount>1)
--如果记录数,超过1,则认为有重复
rollback tran
else if (@DevCount = 1)
begin
select @TmpID = id from vehicle where (cph = @cph) or (DevID = @DevID)
if (@TmpID != @VehID)
--如果增加的车牌号码与数据库中的在相同的,则不允许增加
rollback tran
end
--增加,此时需要在Tbl_Toll中增加
/* insert into tbl_Toll (VehID,[Money], Payer, PayerTel, TollDate, ValidDate, Demo, UserName)
values(@VehID, 0, 'LiaoYuan', '0755-26506932', DATEADD(month, 1, getDate()), DATEADD(month, 13, getDate()), '' , 'admin' )*/
update vehicle set cph = @Cph where ID = @VehID
end
我正在尝试将其转换为MySQl触发器
DROP TRIGGER IF EXISTS InsertVehTrig;
DELIMITER $$
CREATE TRIGGER InsertVehTrig AFTER INSERT
ON Vehicle FOR EACH ROW
SWL_return:
BEGIN
DECLARE Cph CHAR(50);
DECLARE DevID CHAR(12);
DECLARE VehID BIGINT;
DECLARE TmpID BIGINT;
DECLARE DevCount INT;
SET Cph = rtrim(ltrim(NEW.cph));
SET VehID = NEW.ID;
SET DevID = NEW.DevID;
if(VehID is null) then
select count(id) into @DevCount from vehicle where (cph=@Cph) or (DevID=@DevID);
-- 条件:当前的车牌号 或 设备ID
end if;
if (DevCount > 1) then -- 如果记录数,超过1,则认为有重复
-- Rollback not supported in trigger
SET @SWV_Null_Var = 0;
Leave SWL_return;
else
if (DevCount = 1) then
select ID INTO @TmpID from Vehicle where (Vehicle.cph = @Cph) or (Vehicle.DevID = @DevID);
if (TmpID != VehID) then -- --如果增加的车牌号码与数据库中的在相同的,则不允许增加
-- Rollback not supported in trigger
Leave SWL_return;
SET @SWV_Null_Var = 0;
end if;
end if;
end if;
update vehicle set cph = @Cph where ID = @VehID;
END;
问题
@
正确吗?据我所知,SQL Server使用@
作为变量声明。但我不知道MySQL是否有效rollback tran
对于MySQL,我应该将其更改为什么?当我想取消插入数据操作时,如何替换MySQL中的asrollback
SET@SWV\u Null\u Var=0代码>意义?我没有看到这个变量的任何声明?这是什么
完成从MS SQL到MY SQL的转换 /* 防止用户插入的数据中,车牌号码的前后含有空格,此处是将这样的空格去掉 程宪平-----2009-04-19
修改记录: 2009-04-23
修改原因: 车牌必须唯一,德维德也必须唯一,所以其一致性必须通过数据库自身来进行处理,保证一致性 */ 如果存在插入式触发器,则触发
DELIMITER $$
CREATE TRIGGER InsertVehTrig after INSERT
ON Vehicle FOR EACH ROW
SWL_return:
BEGIN
DECLARE TmpID BIGINT;
DECLARE DevCount INT;
DECLARE msg VARCHAR(255);
DECLARE New_Cph VARCHAR(100);
SET New_Cph = NEW.Cph;
select count(id) into DevCount from vehicle where (vehicle.Cph=New_Cph) or (vehicle.DevID=New.DevID);
if (DevCount > 1) then -- 如果记录数,超过1,则认为有重复
set msg = concat('Cannot Create Same CPH or DevID : \r\nDevCount=',DevCount,'\r\nCPH=',New_Cph,'\r\nDevID=',New.DevID);
SIGNAL sqlstate '45001' set message_text = msg;
else
if (DevCount = 1) then
select ID INTO TmpID from Vehicle where (Vehicle.Cph = New_Cph) or (Vehicle.DevID = New.DevID);
if (TmpID != New.ID) then -- --如果增加的车牌号码与数据库中的在相同的,则不允许增加
set msg = concat('Cannot Create Same CPH or DevID : \r\nTmpID=',TmpID,'\r\nCPH=',New_Cph,'\r\nDevID=',New.DevID);
SIGNAL sqlstate '45001' set message_text = msg;
end if;
end if;
end if;
END;
在MySql中,这用于取消Insert语句
set msg = concat('Cannot Create Same CPH or DevID : \r\nTmpID=',TmpID,'\r\nCPH=',New_Cph,'\r\nDevID=',New.DevID);
SIGNAL sqlstate '45001' set message_text = msg;
你的问题还需要帮助吗?@peterm所有问题都解决了