MySQL 插入后触发器 "Unknown Column"

标签 mysql triggers

我已经研究过这个问题,它通常与列名不匹配有关。我检查并重新检查了我的列名以确保它们匹配。我不明白为什么它在提示。也许我需要的只是第二双眼睛,或者长时间的午休时间?

表格:

DROP TABLE IF EXISTS `User`;
CREATE TABLE `User` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `userType` varchar(20) NOT NULL,
  `firstName` varchar(20) NOT NULL,
  `lastName` varchar(40) NOT NULL,
  `email` varchar(40) DEFAULT NULL,
  `contributorRating` int(1) DEFAULT NULL,
  `dateCreated` timestamp DEFAULT CURRENT_TIMESTAMP,
  `isFlagged` bit(1) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `userType` (`userType`),
  CONSTRAINT `User_ibfk_1` FOREIGN KEY (`userType`) REFERENCES `UserType` (`userType`)  ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `User_Project`;
CREATE TABLE `User_Project` (
  `projectID` int(11) NOT NULL,
  `userID` int(11) NOT NULL,
  `joinDate` timestamp DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`projectID`,`userID`),
  KEY `userID` (`userID`),
  CONSTRAINT `User_Project_ibfk_1` FOREIGN KEY (`projectID`) REFERENCES `Project` (`ID`) ON UPDATE CASCADE,
  CONSTRAINT `User_Project_ibfk_2` FOREIGN KEY (`userID`) REFERENCES `User` (`ID`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

DROP TABLE IF EXISTS `Project`;
CREATE TABLE `Project` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `userID` int(11) NOT NULL,
  `projectName` varchar(40) NOT NULL,
  `frequencyType` varchar(10) DEFAULT NULL,
  `projectType` varchar(20) NOT NULL,
  `projectDescription` text NOT NULL,
  `dateCreated` timestamp DEFAULT CURRENT_TIMESTAMP,
  `startDate` timestamp DEFAULT 0,
  `endDate` timestamp DEFAULT 0,
  `isActive` tinyint(1) unsigned NOT NULL,
  `visibility` varchar(20) DEFAULT 'private',
  `region` varchar(20) NOT NULL,
  `isFlagged` bit(1) DEFAULT NULL,
  `lastUpdate` timestamp DEFAULT 0,
  PRIMARY KEY (`ID`),
  KEY `userID` (`userID`),
  KEY `frequencyType` (`frequencyType`),
  KEY `projectType` (`projectType`),
  CONSTRAINT `Project_ibfk_1` FOREIGN KEY (`userID`) REFERENCES `User` (`ID`) ON UPDATE CASCADE,
  CONSTRAINT `Project_ibfk_2` FOREIGN KEY (`frequencyType`) REFERENCES `Frequency` (`frequency`) ON UPDATE CASCADE,
  CONSTRAINT `Project_ibfk_3` FOREIGN KEY (`projectType`) REFERENCES `ProjectType` (`projectType`) ON UPDATE CASCADE,
  CONSTRAINT `Project_ibfk_4` FOREIGN KEY (`visibility`) REFERENCES `Visibility` (`visibility`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

触发器:

 DROP TRIGGER IF EXISTS ins_Project;
 CREATE TRIGGER ins_Project AFTER INSERT ON `Project`
 FOR EACH ROW 
 BEGIN
  SET NEW.lastUpdate = NOW();
  INSERT IGNORE INTO User_Project(projectID,userID,joinDate) VALUES (NEW.ID,NEW.userID,NOW());
 END;

错误:

ERROR 1054 (42S22): Unknown column 'NEW.ID' in 'field list'

最佳答案

我对此不是 100% 肯定的,因为文档并没有真正涉及到这一点,但我认为你只是打算使用

SET NEW.lastUpdate = NOW();

或类似的 SETBEFORE 触发器中的插入行设置字段值。

尝试将该部分拆分成一个 BEFORE INSERT 触发器,看看它是否有效。也许在后触发器上下文中,在这样的记录字段上调用 ​​SET 会更新行并丢失导致错误的记录指针。

我这样说是因为 MySQL 文档只明确指出您可以在前触发期间 SET 行值。检查文档中的这句话:

In a BEFORE trigger, you can also change its value with SET NEW.col_name = value if you have the UPDATE privilege for it. This means you can use a trigger to modify the values to be inserted into a new row or that are used to update a row.

关于MySQL 插入后触发器 "Unknown Column",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14990797/

相关文章:

php - 连接到在 Ubuntu AWS 实例中创建的 MySQL 数据库

mysql - 用于使用 mysql 查询进行分组

sqlite - SQLite:如果操作相同,如何将两个触发器组合为一个?

php - 检查 MySQL 表中是否存在 PHP 变量

c# - 数据库中的图像

php - 带有位字段的 PDO 准备语句

sql - 在 PostgreSQL 上编写触发器脚本时出错

events - 如何触发一段音频从倒计时时钟播放

c# - 背景属性不指向路径 '(0).(1)' 中的依赖对象

mysql - 如何编写一个触发器,在提交插入之前更新同一个表中的行?