如何在MySQL中创建序列?

时间:2014-10-26 21:43:45

标签: mysql sql sequence

我试图在MySQL中创建一个序列(我对SQL作为一个整体非常新)。我使用以下代码,但会导致错误:

CREATE SEQUENCE ORDID INCREMENT BY 1 START WITH 622;

ORDID指的是表I中使用的字段。如何正确创建序列?

编辑:

据称,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;

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

4 个答案:

答案 0 :(得分:21)

结帐this article。我相信它应该可以帮助你得到你想要的东西。如果您的表已经存在,并且其中已有数据,则您获得的错误可能是由于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;

This link也有助于描述auto_increment的用法。 设置AUTO_INCREMENT值似乎是table option,而不是专门指定为列属性的内容。

另外,根据上面的一个链接,您也可以通过改变表来设置自动增量开始值。

ALTER TABLE ORD AUTO_INCREMENT = 622;

更新2 以下是使用自动增量的working sqlfiddle example链接 我希望这些信息有所帮助。

答案 1 :(得分:2)

通过创建增量表,您应该知道不要删除插入的行。这样做的原因是为了避免在带有ID-s的db中存储大的哑数据。否则,如果mysql重新启动,它将获得最大的现有行,并从文档http://dev.mysql.com/doc/refman/5.0/en/innodb-auto-increment-handling.html

中提及的那一点继续增加

答案 2 :(得分:2)

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 );  

-============================================= ========================
-通过iIncrement递增sSeqName的序列值并返回。
-如果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.

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

答案 3 :(得分:0)

如果您需要与AUTO_INCREMENT不同,您仍然可以使用触发器。