我有一个包含主要列id AUTO_INCREMENT
的项目表。每个项目都有一个type
(例如,类型可以是apple
orange
或banana
)和一些列data
。如何创建列iteration
,在插入新项目时,该列是特定类型项目的递增值/ id?
此外,由于该表已填充数据,如何按time_added
的顺序更新现有数据以遵循该模式。
CREATE TABLE IF NOT EXISTS `items` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`iteration` int(11) NOT NULL,
`type` smallint(6) NOT NULL,
`data` binary(16) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `items`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `unique_iteration` (`type`,`data`) USING BTREE;
答案 0 :(得分:1)
您需要针对items
表格设置触发功能:
DELIMITER //
CREATE TRIGGER item_insert BEFORE INSERT ON items
FOR EACH ROW
BEGIN
IF (NEW.iteration IS NULL OR NEW.iteration=0) THEN
SET NEW.iteration = (SELECT 1+MAX(iteration) FROM items WHERE type=NEW.type);
END IF;
END; //
DELIMITER ;
答案 1 :(得分:0)
这是一个非常基本的解决方案,但它实际上应该按照您的要求执行:
INSERT INTO items
(SELECT null,CASE WHEN 'banana' NOT IN(SELECT type FROM items) THEN MAX(iteration) + 1 ELSE (SELECT increment FROM items WHERE type='banana') END,other_values,other_values
FROM items)
SELECT
中的第一个值必须为null
,因为您希望它保持为auto_increment
。第二个值将评估您的新类型(在本例中为banana)是否为NOT IN
类型列。如果是这样,它会将最大iteration
值ELSE
加1,它会设置已与香蕉相关联的值
因此,如果您添加一个类型香蕉并且其中没有香蕉,它应该增加增量的最大值。如果您的餐桌上已经有香蕉,它应该给香蕉增加与香蕉相关的增量值。
编辑: 抱歉,忘记了您要根据time_added更新数据的第二部分:
BEGIN
DECLARE col_id INT DEFAULT 1;
DECLARE stepLoopDone BOOLEAN DEFAULT FALSE;
DECLARE counter INT DEFAULT 1;
DECLARE col_type SMALLINT(6) DEFAULT 1;
DECLARE ORDER_CURSOR CURSOR FOR
SELECT id, type
FROM items
ORDER BY time_added ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET stepLoopDone = TRUE;
OPEN ORDER_CURSOR;
myLoop: LOOP
FETCH ORDER_CURSOR INTO col_id, col_type;
IF stepLoopDone THEN
LEAVE myLoop;
END IF;
/*YOUR UPDATE COMMAND*/
UPDATE items
SET increment = counter
WHERE id = col_id
AND type = col_type
/*YOUR UPDATE COMMAND*/
SET counter = counter + 1;
END LOOP;
CLOSE ORDER_CURSOR;
END
谨慎使用第二个脚本。由于我不能用你的环境测试它,我不能100%确定你的数据是什么。也许你应该做一个备份然后测试它。 我在我的机器上做了一个小测试表,但它确实有效。