如何创建复合auto_increment列,其中一个是group-wise

时间:2015-05-06 08:03:43

标签: mysql sql

父表 - sectionId是主键

|    sectionId     |     Name   |
|       1          |  Section1  |  
|       2          |  Section2  |  
|       3          |  Section3  | 

子表 - 复合键(sectionId和valueId)

|   sectionId    |     valueId    |      LectureValue        |
|    1           |      1         |        somevalue1        |  
|    1           |      2         |        somevalue2        |  
|    2           |      1         |        somevalue3        |  
|    2           |      2         |        somevalue4        |  
|    1           |      3         |        somevalue5        |  
|    2           |      3         |        somevalue6        |  
|    3           |      1         |        somevalue7        |  
|    3           |      2         |        somevalue8        | 

我想基于sectionId来填充valueId,如

1-1
1-2
1-3  

如果sectionId 2出现

2-1
2-2

如果我第一次插入任何sectionId,相应的valueID应为1,然后序列应该继续

有没有办法在MYSQL中做到这一点?

1 个答案:

答案 0 :(得分:1)

不要存储2-1等值。相反,当你需要它时,做

SELECT CONCAT(sectionId, '-', valueId) AS my_fancy_valueId FROM table...

然后,您可以使用MyISAM存储引擎使用表格来实现此目的。警告是,它还没有(还)支持外键或交易。

来自manual

  

对于MyISAM表,您可以在多列索引中的辅助列上指定AUTO_INCREMENT。在这种情况下,AUTO_INCREMENT列的生成值计算为MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。当您想要将数据放入有序组时,这非常有用。

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;
  

返回:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+
  

在这种情况下(当AUTO_INCREMENT列是多列索引的一部分时),如果删除任何组中具有最大AUTO_INCREMENT值的行,则重用AUTO_INCREMENT值。即使对于MyISAM表也会发生这种情况,因为通常不会重复使用AUTO_INCREMENT值。