автоинкремент mysql для неосновного ключа - PullRequest
3 голосов
/ 26 мая 2011

Еще один вопрос сегодня:)
На этот раз я хотел бы знать, возможно ли / как сделать автоинкремент второго столбца для каждого первичного ключа:

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 ]

2 голосов
/ 08 мая 2014

Мне пришлось столкнуться с подобной проблемой, неестественно упорядочивая дерево категорий. Если вы вставляете все строки для одного идентификатора одновременно, вы можете сделать что-то подобное для каждого subId:

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

Если вам нужно «добавить» строку к идентификатору, вы можете установить @seq с помощью

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

Это, конечно, потребует управления идентификатором приложением, а не mySQL.

Вы можете сделать то же самое, что и последний блок кода, чтобы получить следующий доступный идентификатор.

2 голосов
/ 26 мая 2011

Это может быть не совсем то, что вам нужно, и оно работает только с таблицами 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'),('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 |
+--------+----+---------+
...