programing

MySQL에서 시퀀스를 만들려면 어떻게 해야 합니까?

powerit 2023. 8. 21. 21:41
반응형

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;

왜 이것을 선호하는지 모르겠지만, 다른 사람들이 이것에 대해 도움이 필요하다면 여기 있습니다.:)

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 문은 해당 값을 검색합니다.mysql_insert_id() C API 함수를 사용하여 값을 가져올 수도 있습니다.섹션 23.8.7.37, "mysql_insert_id()"를 참조하십시오.

LAST_INSERT_ID()를 호출하지 않고 시퀀스를 생성할 수 있지만, 이 함수를 사용하면 마지막으로 자동으로 생성된 값으로 서버에서 ID 값이 유지됩니다.여러 클라이언트가 UPDATE 문을 발행하고 SELECT 문(또는 mysql_insert_id())을 사용하여 자체 시퀀스 값을 얻을 수 있으므로 자체 시퀀스 값을 생성하는 다른 클라이언트에 영향을 주거나 영향을 받지 않으므로 다중 사용자가 안전합니다.

기사를 확인해 보세요.그것이 당신이 원하는 것을 얻는 데 도움이 될 것이라고 믿습니다.테이블이 이미 존재하고 테이블에 데이터가 이미 있는 경우 다른 레코드에 대해 이미 존재하는 값을 할당하려는 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 예제에 대한 링크입니다.
이 정보가 도움이 되길 바랍니다.

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가 0이면 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.

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

증분 테이블을 만들면 삽입된 행이 삭제되지 않습니다.그 이유는 ID-s가 들어 있는 db에 큰 dumb 데이터를 저장하지 않기 위해서입니다.그렇지 않으면 mysql을 다시 시작할 경우 최대 기존 행을 가져오고 문서 http://dev.mysql.com/doc/refman/5.0/en/innodb-auto-increment-handling.html 에서 언급한 대로 해당 시점부터 계속 증가합니다.

AUTO_INCREMENT와 다른 것이 필요한 경우에도 트리거를 사용할 수 있습니다.

저는 이것이 저에게 효과가 있다는 것을 알았습니다.열을 변경하지만 동일한 이름을 유지한다고 MYSQL에 말합니다.

변경 가능한 ORDID 변경 ORDID int(10) 부호 없는 auto_increment;

ORD 테이블의 ORDID 열에 자동 증분을 시작하라는 메시지가 표시됩니다.그런 다음 다음 명령을 실행합니다.

ALTERTABLE ORDER AUTO_INCREMENT = 85;

예를 들어, 85에서 다음 행을 시작합니다.

언급URL : https://stackoverflow.com/questions/26578313/how-do-i-create-a-sequence-in-mysql

반응형