如何创建另一个MySQL自动增量列?

时间:2011-09-08 07:29:58

标签: mysql auto-increment

MySQL不支持多个自动增量列。

CREATE TABLE IF NOT EXISTS `parts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `order` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

当我插入新记录时,是否有其他解决方案可以使列order的值自动增加?

7 个答案:

答案 0 :(得分:6)

您可以通过发出另一个增加order的查询在您的应用程序中执行此操作,或者您可以创建一个为您执行此操作的触发器。无论你做什么,为了编程世界的理智 - 不要对order这样的列名使用保留字:)

答案 1 :(得分:4)

为什么你想要2个字段自动递增 - 它们将具有相同的值,所以你可以只使用ID。

如果您希望您的发票/订单具有连续编号,那么您应该将该编号保留在单独的表中,并具有单独的逻辑来更新这些编号。

答案 2 :(得分:3)

根据您的原始表:

CREATE TABLE IF NOT EXISTS `parts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `order` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

这个单一插入查询怎么样:

INSERT INTO `parts` (`name`, `order`) 
SELECT 'name of new part', IFNULL(MAX(`order`), 0) + 1 FROM parts;

如果声明为真,这不是一个安全的查询,可以简单地引入表锁定,如下所示:

LOCK TABLES `parts` AS t1 WRITE, `parts` WRITE;

INSERT INTO `parts` (`name`, `order`) 
SELECT 'name of new part', IFNULL(MAX(`order`), 0) + 1 FROM `parts` AS t1;

UNLOCK TABLES;

答案 3 :(得分:1)

我建议您只将order字段设置为AUTO_INCREMENT;并手动计算id字段的新值。这是一个例子 -

CREATE TABLE IF NOT EXISTS `parts` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `order` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`, `order`)
) ENGINE=myisam DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

-- Add some new rows with manually auto-incremented id:

--    SELECT COALESCE(MAX(id), 0) + 1 INTO @next_id FROM parts;
--    INSERT INTO parts VALUES(@next_id, '', NULL);
--    SELECT COALESCE(MAX(id), 0) + 1 INTO @next_id FROM parts;
--    INSERT INTO parts VALUES(@next_id, '', NULL);

  INSERT INTO parts SELECT COALESCE(MAX(id), 0) + 1, '', NULL FROM parts;
  INSERT INTO parts SELECT COALESCE(MAX(id), 0) + 1, '', NULL FROM parts;

SELECT * FROM parts;
+----+------+-------+
| id | name | order |
+----+------+-------+
|  1 |      |     1 |
|  2 |      |     1 |
+----+------+-------+


-- Add some new rows for specified `id`, the value for `order` field will be set automatically:

INSERT INTO parts VALUES(2, '', NULL);
INSERT INTO parts VALUES(2, '', NULL);

+----+------+-------+
| id | name | order |
+----+------+-------+
|  1 |      |     1 |
|  2 |      |     1 |
|  2 |      |     2 |
|  2 |      |     3 |
+----+------+-------+

答案 4 :(得分:0)

考虑为order列添加第二个表:

CREATE TABLE IF NOT EXISTS `parts_order` (
  `order` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`order`)
) ENGINE=MyISAM;

使用示例:

-- First we insert a new empty row into `parts_order`
INSERT INTO `parts_order` VALUES (NULL);
-- Next we insert a new row into `parts` with last inserted id from `parts_order`
INSERT INTO `parts` SET `name` = "new name", `order` = LAST_INSERT_ID();

这种方法不需要交易也不需要锁定。

答案 5 :(得分:0)

别想太多_只需将last_id添加到您的订单String中就可以了:) 我以这种方式解决了这一问题,我添加了一个字符串,例如“ Order_2018_00” + LAST_INSERT_ID()。 因此,此字段对于每个添加的集合都是唯一的:)

答案 6 :(得分:0)

为了物有所值,如果有人再次需要这个,你可以使用这个触发器。 它基于 orderid 增加 +1 并且它适用于多个插入值

DELIMITER $$
CREATE TRIGGER MyTrigger BEFORE INSERT ON doc
FOR EACH ROW
BEGIN
    IF NEW.`order` < 0 THEN
        SET NEW.`order` = (select id from parts order by id desc limit 1) +1;
    ELSEIF NEW.`order` > 0 THEN
        SET NEW.`order` = (select id from parts order by id desc limit 1) +1;
    ELSEIF NEW.`order` is null THEN
        SET NEW.`order` = (select id from parts order by id desc limit 1) +1;
    END IF;
END $$
DELIMITER ;