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

Posted

技术标签:

【中文标题】MySql - 可以在插入触发器之前插入 2 列吗?【英文标题】:MySql - can BEFORE INSERT TRIGGER insert into 2 columns? 【发布时间】:2012-12-11 01:29:28 【问题描述】:

是否可以更改此触发器,以便 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;
$$

创建表排序:

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_sortorderid ROW BEGIN INSERT INTO nextcart.sortorder SET sortOrderId = NULL, sortOrder = NEW.sortOrder; SET NEW.sortOrderId = ( 选择 LAST_INSERT_ID());结尾;运行故障回复脚本时出错。细节 跟随。错误 1050:表 'image' 已存在 SQL 语句:CREATE 表 image (imageId int(11) NOT NULL AUTO_INCREMENT,imageFileName varchar(45) 默认 NULL, imagePath varchar(255) 默认空值,imageTitle varchar(100) 默认空值,imageAlt varchar(100) 默认空值,imageWidth int(11) 默认空值,imageHeight int(11) 默认空值,classId int(11) 默认空值, imageSizeId tinyint(4) 非空,isImageEnabled bit(1) 默认 b'0', sortOrderId int(11) 默认空值,主键 (imageId) ) ENGINE=InnoDB AUTO_INCREMENT=5 默认字符集=utf8

【问题讨论】:

【参考方案1】:

image 表中没有名为 sortOrder 的列。

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


回答您的第一个问题:不。由于在 INSERT 语句(触发 BEFORE INSERT TRIGGER)中没有为此提供值,因此您实际上没有该值的来源。

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

如果您想为sortOrder 列提供一个值,那么一种选择是向image 表中添加一个sortOrder 列,然后可以在INSERT INTO image 语句中提供该值。然后它将在触发器中可用。

sortorder 表的用途完全不清楚。)

【讨论】:

感谢您的回复。我想如果我有一个sortorder 表,我可以对我认为要创建的任何其他tableName 进行排序。不过,图像、项目名称、选项卡描述,最终可以归结为任何element正确的?在我的所有表(需要它们)上放置一个 sortOrder 列并解决这个问题是否更精确?

以上是关于MySql - 可以在插入触发器之前插入 2 列吗?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL触发器:在插入之前将记录与先前的记录进行比较

使用“之前”触发器插入后的 MySQL PDO LastInsertID 返回错误值

Mysql触发器用于在插入前检查表中的重复记录

sQL数据库表的主键列设为标识,增量为1,下次插入数据时能不插入主键列吗

MySQL插入查询如果条件匹配在插入触发器之后

插入后的MySQL触发器