提问者:小点点

MySql-插入触发器之前可以插入2列吗?


是否可以更改此触发器,以便SortOrder表获得插入的2个列值(SortOrderID,SortOrder)?

如何找到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;
$$

创建表排序顺序:

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$$

创建表图像:

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:“new”SQL语句中的列“sortOrder”未知:
在INSERT ON image之前为每一行开始INSERT to nextcart.sortOrder设置sortOrderId=NULL,sortOrder=new.sortOrder;设置new.sortorderId=(SELECT LAST_INSERT_ID());结束;运行故障恢复脚本时出错。详情如下。错误1050:表“image”已存在SQL语句:创建表image(imageIDint(11)NOT NULL AUTO_INCREMENT,
imageFileNamevarchar(45)默认NULL,imagePathvarchar(255)默认NULL,imageTitlevarchar(100)默认NULL,imageAltvarchar(100)默认NULL,


共1个答案

匿名用户

image表中没有名为sortorder的列。

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

回答您的第一个问题:不是,因为INSERT语句(它激发了BEFORE INSERT触发器)中没有为该值提供任何值,所以您实际上没有该值的源。

简单的选项是为它提供一个默认值。

如果要为sortOrder列提供一个值,那么一个选项是向Image表添加一个sortOrder列,然后可以在Insert INTO Image语句中提供该值。那么它将在触发器中可用。

sortorder表的用途根本不清楚。)