два автоинкрементных поля в одной таблице MySQL - PullRequest
0 голосов
/ 16 января 2020

Я настраиваю таблицу, которая нуждается в двух автоматически увеличивающихся полях: «id» и «member #».

Я буду использовать AUTO_INCREMENT = 1001 для последних для новых данных, поскольку есть старые данные с номерами членов менее 1000.

Я буду использовать «MAX (id) +1» в поле 'id', чтобы автоматически увеличить его.

Но я не уверен, будет ли это работать всякий раз, когда есть INSERT, или даже где помещать этот бит кода. Все, что я пытаюсь сделать здесь, это автоматически увеличивать поле, ничего не выбирая.

И из любопытства, почему в таблице только одно поле AUTO_INCREMENTing?

Конечно, код AUTO_INCREMENT_2, AUTO_INCREMENT_3 и т. Д. c не может быть сложным.

Все ответы и помощь приветствуются.

===============================

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ И ССЫЛКИ

Извините за задержку с ответом, я проводил дополнительное исследование.

Хорошо, чтобы объяснить подробнее, у нас есть люди, присоединяющиеся к нашей группе через net. Таким образом, мы должны назначить уникальный номер участника каждому человеку. Два Джона Делает? Два разных номера участника. Для этого я установил для столбца № члена значение AUTO_INCREMENT, а затем AUTO_INCREMENT = 1001 в качестве параметра таблицы. Старые номера имеют три цифры, новые - четыре. Таким образом, каждый раз, когда кто-то регистрируется в сети как новый участник, появляется команда вставки, которая автоматически присваивает новому члену следующие четыре номера участника di git в серии.

member # INT (6) UNSIGNED NOT NULL UNIQUE KEY AUTO_INCREMENT И как опция таблицы AUTO_INCREMENT = 1001

Надеюсь, это понятно. Другими ситуациями, когда кто-то может захотеть использовать подобную стратегию, может быть назначение последовательных номеров счетов, номеров квитанций, номеров счетов и т. Д. c. Так как же один гарантирует результат +1, ie последовательных чисел?

Теперь нам также нужен столбец идентификатора таблицы. Многим таблицам нужен идентификатор таблицы. Ему также необходимо присвоить значение AUTO_INCREMENT, в нашем случае начиная с 1 и увеличивая на 1 (по умолчанию), чтобы идентифицировать и отличать guish одну строку от другой. Но, к сожалению, в таблице MySQL может быть только один столбец AUTO_INCREMENT. : - /

Таким образом, эта ситуация относится к классу проблем, известных как проблемы MAX + 1. (Это также может быть связано с решениями ROW_COUNT и LAST_INSERT_ID.) Ограничение одного поля AUTO_INCREMENT на таблицу требует обходного пути MAX + 1, и я ищу совет о наилучшем способе реализации этого. Например, есть ли способ установить это внутри самой команды CREATE TABLE при определении поля id? Или что-то еще такого же простого характера, например, написание функции. Действительно, предпочтительно оптимизировать эффективность и использовать только необходимые функции, а не реализовывать серию команд. Обычно предлагаемый обходной путь может быть следующим:

Lock tables membership write;
$max = SELECT MAX(id) FROM membership;
INSERT INTO membership ( id, firstname, lastname )
VALUES ($max+1 , 'jane', 'smith')
unlock tables;

Есть ли что-то лучше?

Как должны существовать функции AUTO_INCREMENT_2 / _3 .... Ну, я должен отметить, что в MySQL есть множество функций, которые я никогда не буду использовать, но, очевидно, кому-то они нужны. Тем не менее, было бы удобно иметь это для тех (редких) случаев, когда это может понадобиться. Возможно, следует провести различие между наличием функции и ее использованием в любой таблице. Я сомневаюсь, что неиспользуемая функция требует большого количества дополнительной памяти или кликов (которые в наши дни довольно дешевы).

Некоторые ссылки, которые могут оказаться полезными для понимания этой ситуации:

https://duckduckgo.com/?q=mysql+max%2B1+problems&t=ffab&atb=v1-1&ia=web

Вставьте и установите значение с помощью max () + 1 проблем

Проблема с MySql INSERT MAX () + 1

https://bugs.mysql.com/bug.php?id=3575

Все ответы, советы и помощь приветствуются.

Ответы [ 2 ]

0 голосов
/ 16 января 2020
  1. В MySQL структура таблицы не может содержать более одного поля auto_increment. При попытке создать таблицу с 2 автоинкрементными полями или изменить таблицу при попытке создания второго автоинкремента запрос не выполняется.

  2. Автоинкремент гарантирует, что каждое следующее значение, сгенерированное в поле, будет больше, чем предыдущий в текущем соединении. Но это НЕ гарантирует, что каждое следующее значение, сгенерированное в поле, будет больше предыдущего значения на 1. "Дельта" может быть 2 или даже 1000 ... она не может быть отрицательной или только нулевой.

0 голосов
/ 16 января 2020

Каждая таблица InnoDB имеет не более одного счетчика для своего автоинкремента. Это часть реализации. Если бы вы могли определить N столбцов с автоинкрементом в одной и той же таблице, потребовалось бы больше места для хранения N счетчиков. Это потребовало бы, чтобы блокировка автоинкремента длилась дольше, пока вы увеличивали N счетчиков.

Что касается того, почему на одну таблицу приходится только один, конечно, возможно, что они могли бы реализовать ее для поддержки более чем одного, но почему?

Это усложнит реализацию и снизит производительность в случаях, когда 99,99% приложений не нужны.

В большинстве случаев они пытались удовлетворить потребности. , Почти в каждом случае таблицы с автоинкрементом достаточно одного на таблицу.

Практически в каждом случае, когда кто-то, как вы, считает, что ему нужно более одного на стол, было бы разумно сделать шаг назад и пересмотреть свой дизайн.

...