mariadb - 无法更新表的列,但在 phpmyadmin 中使用更新 sql 查询后工作
问题描述
当用户尝试更新他们的设置时,我插入了我的审计日志表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 个表会是问题吗?找到错误/问题的任何帮助或提示都会很棒!
解决方案
不是最好的解决方案,但我找到了解决方法,
我将nickName
列从:
ALTER TABLE userProfiles
CHANGE 'nickName' 'nickName' varchar(128)
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
DEFAULT NULL;
至:
ALTER TABLE `userProfiles`
CHANGE `nickName` `nickName` VARCHAR(128)
CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
NOT NULL DEFAULT 'N/A';
然后列工作并且插入任何新行,但是如果我将其更改回默认空值,那么它会出现故障,如我的帖子中所述。
推荐阅读
- c# - 编组 unique_ptr
- c# - 在 DataGridView 中显示为复选框的布尔属性
- javascript - window.getSelection().baseOffset 错误
- java - 简单命令行程序中的奇怪行为
- c++ - 使用引用来初始化类成员
- android - CameraX 在 1080p 上限制图像分析的解决方法?
- html - GPIO 输出反相
- selenium - 如果我在 Linux slave 中通过 Jenkins 执行,则不会为使用机器人框架的故障案例生成屏幕截图
- python - 在 google colab 中永久保存火车数据
- react-native - sqlite3 没有第二次打开预填充的数据库