如何在MySQL中创建序列?

Ben*_*Ben 21 mysql sql sequence

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

CREATE SEQUENCE ORDID INCREMENT BY 1 START WITH 622;
Run Code Online (Sandbox Code Playgroud)

ORDID指的是我正在使用的表中的字段.如何正确创建序列?

编辑:

据称,MySQL不使用序列.我现在使用以下代码,但这也导致错误.我该如何解决?

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

编辑:

我想我找到了解决办法.对于phpMyAdmin(我正在使用),您可以使用以下代码.

ALTER TABLE ORD AUTO_INCREMENT = 622;
Run Code Online (Sandbox Code Playgroud)

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

pup*_*ris 32

这是MySQl手册建议的解决方案:

如果expr作为LAST_INSERT_ID()的参数给出,则该函数返回该参数的值,并将其记为LAST_INSERT_ID()返回的下一个值.这可以用来模拟序列:

创建一个表来保存序列计数器并初始化它:

    mysql> CREATE TABLE sequence (id INT NOT NULL);
    mysql> INSERT INTO sequence VALUES (0);
Run Code Online (Sandbox Code Playgroud)

使用该表生成如下序列号:

    mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
    mysql> SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)

UPDATE语句递增序列计数器并导致下一次调用LAST_INSERT_ID()以返回更新的值.SELECT语句检索该值.mysql_insert_id()C API函数也可用于获取值.请参见第23.8.7.37节"mysql_insert_id()".

您可以在不调用LAST_INSERT_ID()的情况下生成序列,但以这种方式使用函数的实用程序是ID值在服务器中作为最后自动生成的值进行维护.它是多用户安全的,因为多个客户端可以发出UPDATE语句并使用SELECT语句(或mysql_insert_id())获取自己的序列值,而不会影响或受其他生成自己的序列值的客户端的影响.


Dai*_*eyo 25

看看这篇文章.我相信它应该可以帮助你得到你想要的东西.如果您的表已经存在,并且其中已包含数据,则您获得的错误可能是由于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;
Run Code Online (Sandbox Code Playgroud)

此链接也有助于描述auto_increment的用法.设置AUTO_INCREMENT值似乎是一个表选项,而不是具体指定为列属性的值.

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

ALTER TABLE ORD AUTO_INCREMENT = 622;
Run Code Online (Sandbox Code Playgroud)

更新2 这是使用自动增量的工作sqlfiddle示例的链接.
我希望这些信息有所帮助.


Ant*_*lov 6

SEQUENCES like it works on firebird:

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

CREATE TABLE SEQUENCES  
(  
  NM_SEQUENCE VARCHAR(32) NOT NULL UNIQUE,  
  VR_SEQUENCE BIGINT      NOT NULL  
);  
Run Code Online (Sandbox Code Playgroud)

-- ================================================ =======
-创建一个序列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 );  
Run Code Online (Sandbox Code Playgroud)

-- ================================================ ========================
-- 将 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.
Run Code Online (Sandbox Code Playgroud)

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

  • 笑脸分隔符本身就值得点赞 (4认同)