it-roy-ru.com

Как мне создать последовательность в MySQL?

Я пытаюсь создать последовательность в MySQL (я очень плохо знаком с SQL в целом). Я использую следующий код, но это вызывает ошибку:

CREATE SEQUENCE ORDID INCREMENT BY 1 START WITH 622;

ORDID относится к полю в таблице, которую я использую. Как правильно создать последовательность?

Правка:

Предположительно, MySQL не использует последовательности. Сейчас я использую следующий код, но это также вызывает ошибки. Как мне их починить?

CREATE TABLE ORD (
ORDID NUMERIC(4) NOT NULL AUTO_INCREMENT START WITH 622,
//Rest of table code

Правка:

Я думаю, что нашел решение. Для phpMyAdmin (который я использовал) вы можете использовать следующий код.

ALTER TABLE ORD AUTO_INCREMENT = 622;

Я понятия не имею, почему это предпочитает это, но если кому-то еще нужна помощь с этим, тогда вы идете. :)

16
Ben

Проверьте эта статья . Я считаю, что это должно помочь вам получить то, что вы хотите. Если ваша таблица уже существует и в ней уже есть данные, ошибка, которую вы получаете, может быть связана с тем, что auto_increment пытается присвоить значение, которое уже существует для других записей.

Короче говоря, как уже упоминалось в комментариях, последовательности, как они рассматриваются и обрабатываются в Oracle, не существуют в MySQL. Тем не менее, вы можете использовать auto_increment для достижения желаемого. 

Без дополнительных сведений о конкретной ошибке трудно предоставить более конкретную помощь.

ОБНОВЛЕНИЕ

CREATE TABLE ORD (
  ORDID INT NOT NULL AUTO_INCREMENT,
  //Rest of table code
  PRIMARY KEY (ordid)
)
AUTO_INCREMENT = 622;

Эта ссылка также полезна для описания использования auto_increment . Установка значения AUTO_INCREMENT представляется параметром таблицы , а не чем-то, что конкретно указывается в качестве атрибута столбца.

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

ALTER TABLE ORD AUTO_INCREMENT = 622;

UPDATE 2 Вот ссылка на рабочий пример sqlfiddle , использующий автоинкремент.
Я надеюсь эта информация поможет.

17
Daileyo

Это решение предложено в руководстве MySQl :

Если в качестве аргумента LAST_INSERT_ID () задано выражение expr, значение аргумент возвращается функцией и запоминается как следующий значение, которое будет возвращено LAST_INSERT_ID (). Это может быть использовано для имитации последовательности:

Создайте таблицу для хранения счетчика последовательности и инициализируйте его:

    mysql> CREATE TABLE sequence (id INT NOT NULL);
    mysql> INSERT INTO sequence VALUES (0);

Используйте таблицу для генерации порядковых номеров следующим образом:

    mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
    mysql> SELECT LAST_INSERT_ID();

Оператор UPDATE увеличивает счетчик последовательности и вызывает следующий вызов LAST_INSERT_ID () для возврата обновленного значения. Оператор SELECT возвращает это значение. Mysql_insert_id () C API Функция также может быть использована для получения значения. См. Раздел 23.8.7.37, «Mysql_insert_id ()». 

Вы можете генерировать последовательности без вызова LAST_INSERT_ID (), но полезность использования функции таким образом, что значение идентификатора поддерживается на сервере как последнее автоматически сгенерированное значение. Это является многопользовательским безопасным, потому что несколько клиентов могут выдать UPDATE оператор и получить свое собственное значение последовательности с помощью оператора SELECT (или mysql_insert_id ()), без влияния или влияния других клиенты, которые генерируют свои собственные значения последовательности.

24
pupitetris

Создавая таблицу приращений, вы должны помнить, чтобы не удалять вставленные строки. Причина этого заключается в том, чтобы не хранить большие глупые данные в БД с идентификаторами в нем. В противном случае при перезапуске mysql он получит максимально существующую строку и продолжит приращение с этого момента, как указано в документации http://dev.mysql.com/doc/refman/5.0/en/innodb-auto-increment-handling. HTML

2
Dato Janez

Если вам нужно что-то отличное от AUTO_INCREMENT, вы все равно можете использовать триггеры.

0
Marek Lisiecki