Должен ли столбец автоинкремента MySQL быть уникальным или первичным? - PullRequest
1 голос
/ 14 июля 2020

Я разрабатывал базу данных на SQL сервере, где я использовал столбец идентификаторов в качестве начального значения для поля первичного ключа. Намерение состояло в том, чтобы сбрасывать идентификатор до 1 в начале каждого года. Это позволит нам создать PK года - столбец идентичности.

Create Table Issues (
IssueID  AS RIGHT(CONVERT(VARCHAR, Year(getdate()), 4),2) + '-' + RIGHT(REPLICATE('0', 2) + 
CONVERT(VARCHAR, RecordID),3) NOT NULL PRIMARY KEY,
RecordID int Identity (1,1),.........)

Результат будет

<br>IssueID    RecordID
20-001        1
20-002        2
20-003        3
21-001        1
etc....

Теперь мне сказали, что мы собираемся использовать MySQL вместо базы данных.

  1. Может ли поле Auto-Increment в MySQL содержать повторяющиеся значения, как в SQL Server?
  2. Если нет, как я могу сделать что Мне нужно сделать в MySQL?

Ответы [ 2 ]

0 голосов
/ 15 июля 2020

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

Это была функция механизма хранения MyISAM много лет назад go. Автоинкремент, который был вторым столбцом многостолбцового первичного ключа, начал бы отсчет с единицы для каждого отдельного значения в первом столбце PK. См. Пример в разделе «Примечания MyISAM» на этой странице: https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html

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

В InnoDB таблица не может генерировать значение, которое является дубликатом текущего значения в таблице, или даже значение, меньшее, чем максимальное значение, ранее созданное для этой таблицы . Другими словами, нет способа «заполнить пробелы» с помощью автоинкремента.

Вы можете использовать ALTER TABLE mytable AUTO_INCREMENT=1 для сброса счетчика, но установленное вами значение автоматически увеличится до максимального значения в настоящее время в таблице + 1.

Таким образом, вам придется сгенерировать его, используя либо другую таблицу, либо что-то другое, кроме базы данных MySQL. Например, я видел, как некоторые люди использовали memcached, который поддерживает операцию atomi c «счетчик приращения и возврата».

Еще одна вещь, которую следует учитывать: если вам нужен счетчик строк в год, это на самом деле отличается от использования функции автоматического увеличения MySQL. Последний не просто использовать в качестве счетчика строк. Кроме того, что произойдет, если вы откатите транзакцию или удалите строку? В результате вы получите непоследовательные значения RecordId с необъяснимыми «пробелами». Также факт в отношении функции автоматического увеличения: она гарантирует, что последующие идентификаторы будут больше, но не гарантирует, что все значения будут последовательно генерироваться . Так что в конце концов у вас все равно будут пробелы.

0 голосов
/ 15 июля 2020

В MySQL таблица может иметь только один столбец auto_increment, и этот столбец должен быть частью первичного ключа. См. Подробности здесь .

Техническим решением вашей задачи будет создание таблицы с одним столбцом auto_increment, и вы можете получить значение auto_increment, вставив запись в эту таблицу и сразу же вызвав стандарт MySQL функция last_inser_id () . Когда придет время, вы должны усечь таблицу - в этом случае счетчик auto_increment будет сброшен.

...