是否可以更改此触发器,以便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
(imageID
int(11)NOT NULL AUTO_INCREMENT,imageFileName
varchar(45)默认NULL,imagePath
varchar(255)默认NULL,imageTitle
varchar(100)默认NULL,imageAlt
varchar(100)默认NULL,
在image
表中没有名为sortorder
的列。
因此,对new.sortorder
(在触发器中的insert语句上)的引用无效。
回答您的第一个问题:不是,因为INSERT语句(它激发了BEFORE INSERT触发器)中没有为该值提供任何值,所以您实际上没有该值的源。
简单的选项是为它提供一个默认值。
如果要为sortOrder
列提供一个值,那么一个选项是向Image
表添加一个sortOrder列,然后可以在Insert INTO Image
语句中提供该值。那么它将在触发器中可用。
(sortorder
表的用途根本不清楚。)