2011-05-26 58 views
3

另一个问题是今天:)自动递增
这一次,我想知道是否/如何可能进行第二次列自动增量为每个主键:MySQL中使用非主键

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增量。
如何做到这一点,甚至可能吗?

+0

MAKE'ID'和'SUBID'在一起的唯一密钥 – diEcho 2011-05-26 13:07:57

+0

'CREATE TABLE test2的( ID整数UNSIGNED NOT NULL, SUBID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 文本VARCHAR(45)NOT NULL, UNIQUE INDEX ABC(引擎= InnoDB;' - 表格定义不正确;只能有一个自动列,它必须被定义为一个键。 – jurchiks 2011-05-26 14:37:19

回答

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。

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 | 
+--------+----+---------+ 
+0

我使用的InnoDB和枚举ID不是我正在寻找,所以我想它不会为我飞。但也许别人会发现它有用:) – jurchiks 2011-05-26 14:34:42