我是mysql数据库的新手,我的查询是我写了一个触发器 如下所述
我想要的是每当我使用followersId和followId将一行插入到关注者表中时,我希望将相同的ID分别插入到通知表userId和NotifiersId中,但是在搜索很多之后我能找到的只是LAST_INSERT_ID这在我的情况下不适用,因为我的主键是非增量的。
有什么方法可以在followersTable中获取最后输入或最后更新的元组的followersId和followId的值。
我的触发器定义
drop trigger if exists `followNotifyTrigger` ;
delimiter $$
CREATE trigger followNotifyTrigger
after insert on followers
for each row
Begin
declare newUserId int(11);
declare newNotifiersId int(11);
select new.followersId ,New.followingId
into newUserId , newNotifiersId
from followers
where followersId = LAST_INSERT_ID ;
insert into Notification(typeId,userId,notifiersId,time) values (1,newUserId,newNotifiersId,NOW());
END $$
DELIMITER ; //
关注者表格说明
followersId int(11) NO PRI
followingId int(11) NO PRI
response bit(1) NO b'0'
通知表说明
notificationId int(11) NO PRI auto_increment
typeId int(11) YES MUL
userId int(11) YES MUL
notifiersId int(11) YES
time datetime YES
答案 0 :(得分:0)
我确实为我的查询找到了解决方案。使用触发器并不是更好,因为在处理2个表时,一个表可能会进入一个表,而其他表可能不会进入。因此,最好的方法是使用存储过程进行事务处理。
<强>解强>
USE `dbname`;
DROP PROCEDURE IF EXISTS `followNotifyUser`;
DELIMITER $$
USE `dbname` $$
CREATE PROCEDURE followNotifyUser(IN followersId int(11),
IN followingId int(11),
IN response bit,
OUT message varchar(255))
LANGUAGE SQL
DETERMINISTIC
COMMENT 'Adds "nson" to first and last names in the record.'
BEGIN
DECLARE EXIT HANDLER FOR sqlexception
BEGIN
SET message = "mysql exception";
ROLLBACK ;
END;
DECLARE EXIT HANDLER FOR sqlwarning
BEGIN
SET message = "mysql warnnings";
ROLLBACK;
END;
START TRANSACTION;
INSERT INTO followers(followersId,followingId,response) VALUES (followersId,followingId,response);
INSERT INTO Notification(typeId,userId,notifiersId,time)VALUES(1,followersId,followingId,NOW());
COMMIT;
END $$