Я знаю, что MySQL ограничивает столбцы auto_increment первичными ключами. Почему это? Сначала я подумал, что это ограничение производительности, поскольку, возможно, где-то есть какая-то таблица счетчиков, которую нужно заблокировать, чтобы получить это значение.
Почему я не могу иметь несколько столбцов auto_increment в одной таблице?
Спасибо.
mysql
primary-key
auto-increment
Кристофер Армстронг
источник
источник
Ответы:
Зачем вам нужен столбец auto_increment, который не является первичным ключом?
Если вы хотите, чтобы столбец был auto_increment, по определению вы не храните значимые данные в этом столбце. Единственный случай, когда хранение бессмысленной информации имеет смысл, - это особый случай, когда вы хотите иметь синтетический первичный ключ. В этом случае отсутствие информации является преимуществом, потому что нет никакого риска, что кто-то когда-либо появится в будущем и захочет изменить данные, потому что какой-то атрибут некоторого объекта изменился.
Наличие нескольких столбцов auto_increment в одной таблице кажется еще более странным. Эти два столбца будут иметь одинаковые данные - они генерируются по одному и тому же алгоритму и заполняются в одно и то же время. Я полагаю, вы могли бы придумать реализацию, в которой они могли бы быть немного не синхронизированы, если бы было достаточно одновременных сеансов. Но я не могу представить, как это было бы полезно в приложении.
источник
Фактически, атрибут AUTO_INCREMENT не ограничен ПЕРВИЧНЫМ КЛЮЧОМ (больше). Раньше так было в старых версиях - определенно 3.23 и, вероятно, 4.0. Тем не менее, руководство по MySQL для всех версий, начиная с 4.1, читается так
Таким образом, в таблице действительно может быть столбец AUTO_INCREMENT, который не является первичным ключом. Если это имеет смысл, это уже другая тема.
Я должен также упомянуть, что столбец AUTO_INCREMENT всегда должен быть целочисленным типом (технически тип с плавающей запятой также допускается) и что он должен быть UNSIGNED. Тип SIGNED не только тратит половину пространства ключа, но также может привести к огромным проблемам, если случайно вставить отрицательное значение.
Наконец, MySQL 4.1 и более поздние версии определяют псевдоним типа SERIAL для BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
источник
Это интересный вопрос, потому что разные базы данных имеют уникальные подходы для предоставления auto_increment.
MySQL : генерируется только один ключ auto_increment для уникальной идентификации строки в таблице. За этим стоит не много объяснений, а просто реализация. В зависимости от типа данных значения auto_increment фиксируются по длине типа данных в байтах:
PostgreSQL
Внутренний серийный тип данных используется для автоматического увеличения от 1 до 2 147 483 647. Большие диапазоны разрешены при использовании bigserial.
Oracle : объект схемы SEQUENCE может создавать новые числа, просто вызывая функцию nextval. PostgreSQL также имеет такой механизм.
Вот хороший URL, который показывает, как их определяют другие БД: http://www.w3schools.com/sql/sql_autoincrement.asp
Теперь, что касается вашего вопроса, если вы действительно хотите иметь несколько столбцов auto_increment в одной таблице, вам придется подражать этому.
Две причины, почему вы должны подражать этому:
Как бы вы подражали этому ???
Использование нескольких таблиц, имеющих только один столбец auto_increment, и сопоставление их с нужными столбцами в целевых таблицах. Вот пример:
Скопируйте и вставьте этот пример:
Это создаст таблицу поп-тестов для учителей. Я также создал пять эмуляторов последовательности, по одному на каждый день школьной недели. Каждый эмулятор последовательности работает, вставляя значение 0 в столбец val. Если эмулятор последовательности пуст, он начинается с val 0, nextval 1. Если нет, столбец nextval увеличивается. Затем вы можете получить следующий столбец из эмулятора последовательности.
Вот пример результатов из примера:
Если вам действительно нужно несколько значений автоинкремента в MySQL, это самый близкий способ эмулировать его.
Попробуйте!
ОБНОВЛЕНИЕ 2011-06-23 21:05
Я только заметил, что в моем примере я не использую значение @pop.
На этот раз я заменил «pop_tue = pop_tue + 1» на «pop_tue = @pop» и повторил пример:
источник
bigserial
тип данных, который предлагает диапазон, намного превышающий 2 147 483 647Как говорит XL, он не ограничивается только первичными ключами. Потенциальным ограничением является то, что в каждой таблице может быть только один такой столбец, но лучший способ - сгенерировать столько чисел, сколько вам нужно, в другой таблице, а затем вставлять их там, где вам нужно.
источник