Как создать последовательность в 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;
Я понятия не имею, почему он предпочитает это, но если кому-то еще нужна помощь в этом, то здесь вы идете.:)
Ответы
Ответ 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.
- ============================================= ======================