Как создать последовательность в 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;

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

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

Если expr передается в качестве аргумента функции LAST_INSERT_ID(), то значение аргумента аргумента возвращается функцией и запоминается как следующее значение, которое будет возвращено функцией 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 извлекает это значение. API mysql_insert_id() C также может быть использована для получения значения. См. раздел 23.8.7.37, "mysql_insert_id()".

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

Комментарии (0)
Решение

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

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

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

UPDATE

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;

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

Комментарии (5)

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

Комментарии (0)