Подтвердить что ты не робот

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

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

CREATE SEQUENCE ORDID INCREMENT BY 1 START WITH 622;

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

Edit:

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

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

Edit:

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

ALTER TABLE ORD AUTO_INCREMENT = 622;

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

4b9b3361

Ответ 1

Ознакомьтесь с этой статьей. Я считаю, что это должно помочь вам получить то, что вы хотите. Если ваша таблица уже существует и у нее уже есть данные, ошибка, которую вы получаете, может быть вызвана тем, что 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, используя автоматическое увеличение.
Надеюсь, эта информация поможет.

Ответ 2

Это решение предлагаемое руководством 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()), не затрагивая или не затрагивая другие клиентов, которые генерируют свои собственные значения последовательности.

Ответ 3

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

Ответ 4

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

Ответ 5

SEQUENCES like it works on firebird:

- ====================================================== =======

CREATE TABLE SEQUENCES  
(  
  NM_SEQUENCE VARCHAR(32) NOT NULL UNIQUE,  
  VR_SEQUENCE BIGINT      NOT NULL  
);  

- ============================================= ==========
- Создает последовательность sSeqName и устанавливает ее начальное значение.
- ====================================================== =======

DROP PROCEDURE IF EXISTS CreateSequence;  

DELIMITER :)  
CREATE PROCEDURE CreateSequence( sSeqName VARCHAR(32), iSeqValue BIGINT )  
BEGIN  
  IF NOT EXISTS ( SELECT * FROM SEQUENCES WHERE (NM_SEQUENCE = sSeqName) ) THEN  
    INSERT INTO SEQUENCES (NM_SEQUENCE, VR_SEQUENCE)  
    VALUES (sSeqName   , iSeqValue  );  
  END IF;  
END :)  
DELIMITER ;  

-- CALL CreateSequence( 'MySequence', 0 );  

- ============================================= ==========================
- Увеличивает значение последовательности sSeqName на iIncrement и возвращает его.
- Если iIncrement равен нулю, возвращает текущее значение sSeqName.
- ====================================================== =======================

DROP FUNCTION IF EXISTS GetSequenceVal;  

DELIMITER :)  
CREATE FUNCTION GetSequenceVal( sSeqName VARCHAR(32), iIncrement INTEGER )  
RETURNS BIGINT  -- iIncrement can be negative  
BEGIN  
  DECLARE iSeqValue BIGINT;  

  SELECT VR_SEQUENCE FROM SEQUENCES  
  WHERE  ( NM_SEQUENCE = sSeqName )  
  INTO   @iSeqValue;  

  IF ( iIncrement <> 0 ) THEN  
    SET @iSeqValue = @iSeqValue + iIncrement;  

    UPDATE SEQUENCES SET VR_SEQUENCE = @iSeqValue  
    WHERE  ( NM_SEQUENCE = sSeqName );  
  END IF;

  RETURN @iSeqValue;
END :)  
DELIMITER ;  

-- SELECT GetSequenceVal('MySequence', 1);  -- Adds 1 to MySequence value and returns it.

- ============================================= ======================