1

この問題を調査しましたが、通常は列名が一致していないことに関連しています。列名を確認して再確認し、一致していることを確認しました。なぜそれが不平を言っているのか理解できません。たぶん、私が必要なのは2番目の目のペア、または長い昼休みですか?

テーブル:

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'
4

1 に答える 1

5

ドキュメントが実際にはこれに触れていないので、私はこれに100%肯定的ではありませんが、あなたは使用することだけを意図していると思います

SET NEW.lastUpdate = NOW();

または、トリガーSETの挿入行のフィールド値を設定するのと同様です。BEFORE

BEFORE INSERTその部分をトリガーに分割してみて、それが機能するかどうかを確認してください。おそらくアフタートリガーコンテキストで、そのようなレコードフィールドでSETを呼び出すと、行が更新され、レコードポインターが失われ、エラーが発生します。

SETMySQLのドキュメントには、beforeトリガー中に行の値を指定できると明示的に記載されているだけなので、これを言います。ドキュメントからこの引用を確認してください:

BEFOREトリガーでは、UPDATE特権がある場合は、SET NEW.col_name=valueを使用してその値を変更することもできます。これは、トリガーを使用して、新しい行に挿入される値、または行を更新するために使用される値を変更できることを意味します。

于 2013-02-20T22:20:58.240 に答える