问题描述
|
今天另一个问题:)
这次,我想知道是否/如何使每个主键的第二列自动增加:
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
指定为索引键时,此创建才起作用(但是我需要同时使用它们,and1ѭ可以重复...)
示例数据(我需要什么):
1,1
1,2
1,3
2,1
2,2
3,1
将ID
用作主索引和subId
索引的问题在于subId
的递增独立于ID
。
如何做到这一点,甚至有可能吗?
解决方法
我不得不处理一个类似的问题,即不自然地排序类别树。
如果您一次插入一个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;
当然,这将需要由应用程序而不是mySQL管理id。
您可以执行与最后一个代码块相同的操作,以获取下一个可用的ID。
,它可能不完全是您想要的,并且仅适用于MyISAM和BDB表,但是我认为最接近您要求的是分组的主键。
从手册中:
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\'),\'whale\'),\'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 |
+--------+----+---------+