MySql - 可以在插入TRIGGER之前插入2列吗?

时间:2012-12-24 18:16:09

标签: mysql triggers referential-integrity

是否可以更改此触发器,以便sortorder表格插入2列值(sortOrderIdsortOrder)?

如何找到sortOrder的值?

如果已知并且可以插入image表,那么它是否也可以插入到sortorder表中?

-- Trigger DDL Statements
DELIMITER $$

USE `nextcart`$$

CREATE
DEFINER=`root`@`localhost`
TRIGGER `nextcart`.`insert_sortorderid` 

BEFORE INSERT ON `nextcart`.`image` 

FOR EACH ROW 
BEGIN
    INSERT INTO sortorder SET sortOrderId = NULL, sortOrder = NEW.sortOrder;

    SET NEW.sortOrderId = (SELECT LAST_INSERT_ID());
END;
$$

CREATE TABLE sortorder:

delimiter $$

CREATE TABLE `sortorder` (
  `sortOrderId` int(11) NOT NULL AUTO_INCREMENT,
  `sortOrder` tinyint(4) NOT NULL,
  PRIMARY KEY (`sortOrderId`),
  KEY `sort_order` (`sortOrderId`,`sortOrder`),
  CONSTRAINT `fk_sortOrderId` FOREIGN KEY (`sortOrderId`) REFERENCES `image` (`imageId`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8$$

CREATE TABLE image:

delimiter $$

CREATE TABLE `image` (
  `imageId` int(11) NOT NULL AUTO_INCREMENT,
  `imageFileName` varchar(45) DEFAULT NULL,
  `imagePath` varchar(255) DEFAULT NULL,
  `imageTitle` varchar(100) DEFAULT NULL,
  `imageAlt` varchar(100) DEFAULT NULL,
  `imageWidth` int(11) DEFAULT NULL,
  `imageHeight` int(11) DEFAULT NULL,
  `classId` int(11) DEFAULT NULL,
  `imageSizeId` tinyint(4) NOT NULL,
  `isImageEnabled` bit(1) DEFAULT b'0',
  `sortOrderId` int(11) DEFAULT NULL,
  PRIMARY KEY (`imageId`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8$$

错误消息:

  

错误1054:'新'SQL语句中的未知列'sortOrder':
  在每次插入图像之前创建TRIGGER insert_sortorderid   ROW BEGIN INSERT INTO nextcart.sortorder SET sortOrderId = NULL,   sortOrder = NEW.sortOrder; SET NEW.sortOrderId =(SELECT   LAST_INSERT_ID());结束;运行故障回复脚本时出错。细节   跟随。错误1050:表'image'已存在SQL语句:CREATE   表imageimageId int(11)NOT NULL AUTO_INCREMENT,
  imageFileName varchar(45)DEFAULT NULL,imagePath varchar(255)   DEFAULT NULL,imageTitle varchar(100)DEFAULT NULL,imageAlt   varchar(100)DEFAULT NULL,imageWidth int(11)DEFAULT NULL,
  imageHeight int(11)DEFAULT NULL,classId int(11)DEFAULT NULL,   imageSizeId tinyint(4)NOT NULL,isImageEnabled bit(1)DEFAULT   b'0',sortOrderId int(11)DEFAULT NULL,PRIMARY KEY(imageId)   )ENGINE = InnoDB AUTO_INCREMENT = 5 DEFAULT CHARSET = utf8

1 个答案:

答案 0 :(得分:1)

sortOrder表中没有名为image的列。

因此,对NEW.sortOrder的引用(在触发器中的insert语句中)无效。


回答你的第一个问题:不可以。因为在INSERT语句中没有提供任何值(它会触发BEFORE INSERT TRIGGER),你实际上没有该值的来源。

简单的选择是为它提供默认值。

如果要为sortOrder列提供值,则一个选项是将sortOrder列添加到image表,然后可以在INSERT INTO image中提供该值声明。然后它将在触发器中可用。

sortorder表的目的一点都不清楚。)