无法更新 table 的列,但在 phpmyadmin 中使用更新 sql 查询后可以工作

Can't update an table's column but works after using update sql query in phpmyadmin

当用户试图更新他们的设置时,我插入到我的审计日志 table 中调用 userUpdateLog 并且它调用插入前触发器插入到 userProfilesusers 基于列插入各自的 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.

中所述