无法更新 table 的列,但在 phpmyadmin 中使用更新 sql 查询后可以工作
Can't update an table's column but works after using update sql query in phpmyadmin
当用户试图更新他们的设置时,我插入到我的审计日志 table 中调用 userUpdateLog
并且它调用插入前触发器插入到 userProfiles
和 users
基于列插入各自的 table.
但是对于我在 userProfiles
table 之后添加的列 nickName
创建并具有数据,它不会使用查询 [=25= 通过触发器更新]
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 ;
在更改 table 后我需要做些什么吗?将列等添加到 reload/refresh table 中,这样 UPDATE userProfiles SET nickName = NEW.newNickName WHERE userID = NEW.userID
查询将在 php 文件或在触发器中。提前致谢!
更新: 我刚刚在 userProfiles
table 中添加了一个新列,但我无法将 values/input 添加到该列中,但是创建 table 作品时定义了任何列。
更新 - 2 我创建了一个新的 table,使用相同的列,fks,以及所有称为 usersProfiles
和 table也没有更新,直到我通过 phpmyadmin 编辑了该列。我还注意到,当我在 phpmyadmin 中模拟查询时,它说 matched 0 row
,但查询在执行后才起作用。
数据库中有 18 个 table 会是问题所在吗?找到 error/issue 的任何帮助或提示都会很棒!
不是最好的解决方案,但我找到了解决方法,
我更改了 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';
然后列工作并且插入任何新行,但是如果我将其更改回默认 null 然后它会出现故障,如我的 post.
中所述
当用户试图更新他们的设置时,我插入到我的审计日志 table 中调用 userUpdateLog
并且它调用插入前触发器插入到 userProfiles
和 users
基于列插入各自的 table.
但是对于我在 userProfiles
table 之后添加的列 nickName
创建并具有数据,它不会使用查询 [=25= 通过触发器更新]
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 ;
在更改 table 后我需要做些什么吗?将列等添加到 reload/refresh table 中,这样 UPDATE userProfiles SET nickName = NEW.newNickName WHERE userID = NEW.userID
查询将在 php 文件或在触发器中。提前致谢!
更新: 我刚刚在 userProfiles
table 中添加了一个新列,但我无法将 values/input 添加到该列中,但是创建 table 作品时定义了任何列。
更新 - 2 我创建了一个新的 table,使用相同的列,fks,以及所有称为 usersProfiles
和 table也没有更新,直到我通过 phpmyadmin 编辑了该列。我还注意到,当我在 phpmyadmin 中模拟查询时,它说 matched 0 row
,但查询在执行后才起作用。
数据库中有 18 个 table 会是问题所在吗?找到 error/issue 的任何帮助或提示都会很棒!
不是最好的解决方案,但我找到了解决方法,
我更改了 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';
然后列工作并且插入任何新行,但是如果我将其更改回默认 null 然后它会出现故障,如我的 post.
中所述