mysql在非主键上自动递增

时间:2011-05-26 13:03:04

标签: mysql auto-increment

今天的另一个问题:)
这次我想知道是否/如何为每个主键创建第二列自动增量:

CREATE TABLE test (
    `id` INTEGER UNSIGNED NOT NULL,
    `subId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
    `text` VARCHAR(45) NOT NULL,
    PRIMARY KEY (`id`, `subId`)
)
ENGINE = InnoDB;

不幸的是,只有当我将ID指定为主键并将subId指定为索引键时,此创建才起作用(但我需要它们并且ID可以重复。 ..)
示例数据(我需要的):

1, 1
1, 2
1, 3
2, 1
2, 2
3, 1

制作ID主要和subId索引的问题是subId将独立于ID增加。
如何实现这一目标甚至可能?

2 个答案:

答案 0 :(得分:2)

它可能不是你想要的,它只适用于MyISAM和BDB表,但我认为你最接近你所要求的是一个分组的主键。

来自manual

CREATE TABLE animals (
    grp ENUM('fish','mammal','bird') NOT NULL,
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (grp,id)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;
Which returns: 
+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+

答案 1 :(得分:2)

我不得不处理类似问题,不自然地订购类别树。 如果您一次为一个id插入所有行,则可以为每个subId执行类似的操作:

SET @seq = 0;
INSERT INTO test
  (id,  subId,            text) VALUES
  (_id, @seq := @seq + 1, 'Some text')
;

如果您需要在ID中“添加”一行,可以使用

设置@seq
SELECT IFNULL(MAX(subId), 0) INTO @seq FROM test WHERE id = _id;

这当然要求应用程序管理id而不是mySQL。

您也可以像上一个代码块一样获取下一个可用ID。