mysql идентификаторы ручного приращения? - PullRequest
2 голосов
/ 09 июля 2010

У меня есть таблица с элементами (идентификатор, имя и т. Д.), И я хочу, чтобы какая-то схема базы данных могла иметь несколько копий элемента, но при этом могла увеличивать идентификаторы.Будет поле с именем startdate или date_from_which_this_entry_should_be_used.

Я думал о двух способах реализации этого:

  1. Есть таблица только с идентификаторами (первичный ключ, автои) присоединяется к таблице, содержащей всю информацию об элементе.

    Преимущества:

    • легко понять
    • трудно для кого-то, кто придет за мнойзапутаться

    Недостатки:

    • требует больше отладки и кодирования, поскольку эта система уже используется
    • кажется странным иметь таблицу с одним полем
  2. Имейте одну таблицу, используя дополнительный выбор, чтобы получить МАКСИМАЛЬНОЕ значение (+1) для применения к новым предметам.

    Преимущества:

    • отдельная таблица
    • только незначительные корректировки кода (но, может быть, не так уж и сильно)

    Недостатки:

    • подвержены ошибкам(ручное увеличение, невозможно разрешить удаление или значение MAX может быть отключено)

Заранее спасибо!

1 Ответ

7 голосов
/ 09 июля 2010

Вы должны создать таблицу с именем 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 поддерживает автоинкремент только в качестве первого столбца первичного или уникального ключа и не начинается с счетчика для каждого отдельного значения другого столбца.

...