如果MySQL中有重复列,则自动递增

时间:2015-10-28 16:24:24

标签: mysql

我有一个包含主要列id AUTO_INCREMENT的项目表。每个项目都有一个type(例如,类型可以是apple orangebanana)和一些列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;

2 个答案:

答案 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类型列。如果是这样,它会将最大iterationELSE加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%确定你的数据是什么。也许你应该做一个备份然后测试它。 我在我的机器上做了一个小测试表,但它确实有效。