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 매뉴얼에서 제안하는] 해결책입니다1:
expr이 LAST_INSERT_ID()의 인자로 주어지면, 인수의 값은 인수가 함수에 의해 반환되고 다음 값으로 기억됩니다. LAST_INSERT_ID()가 반환할 값입니다. 이 함수는 다음을 시뮬레이션하는 데 사용할 수 있습니다. 시퀀스를 시뮬레이션하는 데 사용할 수 있습니다:
시퀀스 카운터를 보관할 테이블을 생성하고 초기화합니다:
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);
테이블을 사용하여 다음과 같은 시퀀스 번호를 생성합니다:
mysql> UPDATE 시퀀스 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()), 다른 클라이언트에 영향을 주거나 영향을 받지 않고 자체 시퀀스 값을 생성하는 클라이언트.
이 문서]1를 확인하세요. 원하는 것을 얻는 데 도움이 될 것입니다. 테이블이 이미 존재하고 그 안에 데이터가 이미 있는 경우, 다른 레코드에 이미 존재하는 값을 할당하려고 시도하는 자동 증가로 인해 오류가 발생할 수 있습니다.
요컨대, 다른 사람들이 이미 댓글에서 언급했듯이 오라클에서 생각하고 처리하는 시퀀스는 MySQL에 존재하지 않습니다. 그러나 자동 증가를 사용하여 원하는 것을 달성할 수 있습니다.
특정 오류에 대한 추가 세부 정보가 없으면 더 구체적인 도움을 드리기 어렵습니다.
업데이트
CREATE TABLE ORD (
ORDID INT NOT NULL AUTO_INCREMENT,
//Rest of table code
PRIMARY KEY (ordid)
)
AUTO_INCREMENT = 622;
이 링크는 자동 증가의 사용법을 설명하는 데 도움이 됩니다. 자동 증가 값 설정은 열 속성으로 특별히 지정되는 것이 아니라 테이블 옵션으로 설정하는 것으로 보입니다.
또한 위의 링크 중 하나에 따라 테이블 변경을 통해 자동 증가 시작 값을 설정할 수도 있습니다.
ALTER TABLE ORD AUTO_INCREMENT = 622;
업데이트 2
다음은 자동 증분을 사용하는 작동하는 SQLFiddle 예제에 대한 링크입니다.
이 정보가 도움이 되길 바랍니다.
증분 테이블을 만들 때 삽입 된 행을 삭제하지 않도록주의해야합니다. 그 이유는 ID가 포함 된 큰 멍청한 데이터를 DB에 저장하지 않기 위해서입니다. 그렇지 않으면 mysql을 다시 시작할 때 문서 http://dev.mysql.com/doc/refman/5.0/en/innodb-auto-increment-handling.html 에 언급된 대로 최대 기존 행을 가져와서 그 시점부터 증분을 계속합니다.
시퀀스는 다음과 같이 그것에서 작동합 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.
-- ===================================================================