如何在 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;

我不知道为什么它更喜欢这个,但如果其他人需要帮助,那么你就去吧。 :)

原文由 Ben 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 767
2 个回答

看看 这篇文章。我相信它应该可以帮助您获得想要的东西。如果您的表已经存在,并且其中已经有数据,那么您得到的错误可能是由于 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;

更新 2 这是一个使用自动增量的 工作 sqlfiddle 示例 的链接。

我希望这些信息有所帮助。

原文由 Daileyo 发布,翻译遵循 CC BY-SA 3.0 许可协议

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.

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

原文由 Antonov Gazolov 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题