我已经研究过这个问题,它通常与列名不匹配有关。我已经检查并重新检查了我的列名称以确保它们匹配。我不明白为什么它在抱怨。也许我需要的只是第二双眼睛,或者长时间的午休?
表格:
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;
Run Code Online (Sandbox Code Playgroud)
扳机:
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;
Run Code Online (Sandbox Code Playgroud)
错误:
ERROR 1054 (42S22): Unknown column 'NEW.ID' in 'field list'
Run Code Online (Sandbox Code Playgroud)
我对此不是 100% 肯定,因为文档并没有真正涉及到这一点,但我认为您只是打算使用
SET NEW.lastUpdate = NOW();
Run Code Online (Sandbox Code Playgroud)
或类似于SET为BEFORE触发器中的插入行设置字段值。
尝试将该部分拆分为BEFORE INSERT触发器,看看它是否有效。也许在触发后上下文中,在像这样的记录字段上调用 SET 会更新行并丢失导致错误的记录指针。
我这样说是因为 MySQL 文档仅明确说明您可以SET在 before 触发器期间使用行值。从文档中查看此引用:
在 BEFORE 触发器中,如果您具有 UPDATE 权限,您还可以使用 SET NEW.col_name = value 更改其值。这意味着您可以使用触发器来修改要插入新行或用于更新行的值。
| 归档时间: |
|
| 查看次数: |
3996 次 |
| 最近记录: |