当用户尝试更新他们的设置时,我插入了我的审计日志表userUpdateLog
,它调用了一个插入前触发器来插入userProfiles
并users
基于列插入到各自的表中。
但是对于nickName
我在创建表并拥有数据后添加的列userProfiles
,它不会通过使用查询的触发器进行更新
UPDATE userProfiles
SET nickName = NEW.newNickName
WHERE userID = NEW.userID
但是当我在 phpmyadmin 中使用写入值执行查询时
UPDATE userProfiles
SET nickName = 'random'
WHERE userID = 2
它可以工作,并且在该特定行的列中有数据之后,触发器可以工作并且能够在插入userUpdateLog
并执行触发器后更新该行,
其他行遇到相同的问题,直到我通过 phpmyadmin 手动插入。
需要通过 phpmyadmin 手动插入才能工作的这个问题的原因是什么?
CREATE TABLE `userUpdateLog` (
`userUpdateLogID` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`userID` int(11) DEFAULT NULL,
`updateDate` datetime NOT NULL,
`newUserName` varchar(128) DEFAULT NULL,
`newEmail` varchar(128) DEFAULT NULL,
`newNickName` varchar(20) DEFAULT NULL,
`newFirstName` varchar(128) DEFAULT NULL,
`newLastName` varchar(128) DEFAULT NULL,
`oldUserName` varchar(128) DEFAULT NULL,
`oldEmail` varchar(128) DEFAULT NULL,
`oldNickName` varchar(20) DEFAULT NULL,
`oldFirstName` varchar(128) DEFAULT NULL,
`oldLastName` varchar(128) DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DELIMITER $$
CREATE TRIGGER `usersUpdate_bi` BEFORE INSERT ON `userUpdateLog` FOR EACH ROW BEGIN
SET @userName = (SELECT userName FROM users WHERE userID = NEW.userID);
SET @email = (SELECT email FROM users WHERE userID = NEW.userID);
SET @firstName = (SELECT firstName FROM users WHERE userID = NEW.userID);
SET @lastName = (SELECT lastName FROM users WHERE userID = NEW.userID);
SET @nickName = (SELECT nickName FROM userProfiles WHERE userID = NEW.userID);
SET NEW.oldUserName = @userName;
SET NEW.oldEmail = @email;
SET NEW.oldFirstName = @firstName;
SET NEW.oldLastName = @lastName;
SET NEW.oldNickName = @nickName;
IF NEW.newUserName IS NOT NULL AND NEW.newUserName <> NEW.oldUserName THEN
UPDATE users
SET userName = NEW.newUserName
WHERE userID = NEW.userID;
END IF;
IF NEW.newEmail IS NOT NULL AND NEW.newEmail <> NEW.oldEmail THEN
UPDATE users
SET email = NEW.newEmail
WHERE userID = NEW.userID;
END IF;
IF NEW.newFirstName IS NOT NULL AND NEW.newFirstName <> NEW.oldFirstName THEN
UPDATE users
SET firstName = NEW.newFirstName
WHERE userID = NEW.userID;
END IF;
IF NEW.newLastName IS NOT NULL AND NEW.newLastName <> NEW.oldLastName THEN
UPDATE users
SET lastName = NEW.newLastName
WHERE userID = NEW.userID;
END IF;
IF NEW.newNickName IS NOT NULL AND NEW.newNickName <> NEW.oldNickName THEN
UPDATE userProfiles SET nickName = NEW.newNickName
WHERE userID = NEW.userID;
END IF;
END $$
DELIMITER ;
CREATE TABLE `userProfiles` (
`profileID` int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`userID` int(11) NOT NULL,
`imgName` varchar(128) DEFAULT NULL,
`nickName` varchar(128) DEFAULT NULL,
`aboutUser` text DEFAULT NULL,
`genderID` int(11) NOT NULL DEFAULT 0,
`bDay` date DEFAULT NULL,
`favCard` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `users` (
`userID` int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
`firstName` varchar(128) NOT NULL,
`lastName` varchar(128) NOT NULL,
`userName` varchar(128) UNIQUE KEY NOT NULL,
`email` varchar(128) UNIQUE KEY NOT NULL,
`pwd` varchar(128) NOT NULL,
`loginDateTime` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
DELIMITER $$
CREATE TRIGGER `userCreate` AFTER INSERT ON `users` FOR EACH ROW BEGIN
INSERT INTO userProfiles (userID) VALUES(NEW.userID);
END$$
DELIMITER ;
在更改表添加列等之后我需要做些什么来重新加载/刷新表,以便UPDATE userProfiles SET nickName = NEW.newNickName WHERE userID = NEW.userID
查询可以在 php 文件或触发器中工作。提前致谢!
更新:我刚刚在表中添加了一个新列,userProfiles
我无法在该列中添加值/输入,但是在创建表时定义了任何列。
更新 - 2我创建了一个新表,使用相同的列、fks 和所有调用usersProfiles
,并且该表也没有更新,直到我通过 phpmyadmin 编辑了该列。我还注意到,当我在 phpmyadmin 中模拟查询时,它说matched 0 row
,但查询在执行后工作。
数据库中有 18 个表会是问题吗?找到错误/问题的任何帮助或提示都会很棒!