首页 > 解决方案 > 无法更新表的列,但在 phpmyadmin 中使用更新 sql 查询后工作

问题描述

当用户尝试更新他们的设置时,我插入了我的审计日志表userUpdateLog,它调用了一个插入前触发器来插入userProfilesusers基于列插入到各自的表中。

但是对于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 个表会是问题吗?找到错误/问题的任何帮助或提示都会很棒!

标签: mariadbmariadb-10.3

解决方案


不是最好的解决方案,但我找到了解决方法,

我将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';

然后列工作并且插入任何新行,但是如果我将其更改回默认空值,那么它会出现故障,如我的帖子中所述。


推荐阅读