Вы должны создать таблицу с именем item_ids
или что-то для генерации значений идентификаторов. Это нормально, что в нем только один столбец.
CREATE TABLE item_ids (
item_id INT AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;
Вам даже не нужно фиксировать какие-либо данные для него. Вы просто используете его для генерации значений идентификаторов:
START TRANSACTION;
INSERT INTO item_ids DEFAULT VALUES;
SET @id = LAST_INSERT_ID();
ROLLBACK;
Итак, теперь у вас есть безопасный для параллелизма метод создания новых идентификаторов.
Затем вы создаете составной первичный ключ для своей таблицы items
. Вы должны использовать MyISAM для этого.
CREATE TABLE items (
item_id INT,
seq_id INT AUTO_INCREMENT,
name VARCHAR(20),
etc VARCHAR(20),
PRIMARY KEY (item_id, seq_id)
) ENGINE=MyISAM;
MyISAM поддерживает столбец автоинкремента в составном первичном ключе, который будет начинаться со значения 1 для каждого нового item_id
. * Он также использует MAX(item_id)+1
, поэтому, если вы удалите последний, его значение будет перераспределено , Это отличается от другого использования AUTO_INCREMENT, где удаленное значение не используется повторно.
Независимо от того, вставляете ли вы новый элемент или вставляете новую копию существующего элемента, вы используете похожий INSERT:
INSERT INTO items (item_id, name, etc) VALUES (@id, 'Stephane', 'etc');
Параметр @id
является либо значением существующего элемента, либо автоматически сгенерированным значением, которое вы получили из таблицы item_ids
.
* InnoDB поддерживает автоинкремент только в качестве первого столбца первичного или уникального ключа и не начинается с счетчика для каждого отдельного значения другого столбца.