Oracle의 SEQUENCE.NEXTVAL에 해당하는 MySQL
다음 표에서 ID의 다음 값을 반환하는 실행 쿼리를 생성할 수 있어야 합니다.
CREATE TABLE animals (
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (id)
)
Oracle에서 시퀀스에 대해 NEXTVAL을 호출하면 다음 시퀀스가 제공됩니다(참고: 테이블에 삽입할 필요 없음).
검색한 결과 다음 쿼리를 사용하여 auto_increment의 현재 값을 찾을 수 있습니다.
SELECT Auto_increment
FROM information_schema.tables
WHERE table_name='animals';
문제는 값이 조회될 때마다 값이 증가하기를 원한다는 것입니다.Oracle에서 nextval을 호출하면 테이블에 행을 삽입하지 않아도 시퀀스 값이 증가합니다.
반환된 값이 쿼리가 마지막으로 호출된 시간과 항상 다르도록 위 쿼리를 수정할 수 있는 방법이 있습니까? 즉, Auto_increment는 확인할 때마다 증가하고 쿼리에서 사용할 때 새 값을 사용합니다.
Spring JDB를 사용하고 있습니다.CT 템플릿을 사용하여 한 번의 쿼리로 수행할 수 있는지 여부를 확인합니다.
http://docs.oracle.com/cd/E17952_01/refman-5.5-en/example-auto-increment.html
3.6.9. AUTO_INCREMENT 사용
AUTO_INCREMENT 특성을 사용하여 새 행에 대한 고유 ID를 생성할 수 있습니다.
CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (id) ); INSERT INTO animals (name) VALUES ('dog'),('cat'),('penguin'), ('lax'),('whale'),('ostrich'); SELECT * FROM animals; Which returns: +----+---------+ | id | name | +----+---------+ | 1 | dog | | 2 | cat | | 3 | penguin | | 4 | lax | | 5 | whale | | 6 | ostrich | +----+---------+
AUTO_INCREMENT 열에 대한 값이 지정되지 않았으므로 MySQL은 시퀀스 번호를 자동으로 할당했습니다.열에 NULL 또는 0을 명시적으로 할당하여 시퀀스 번호를 생성할 수도 있습니다.
LAST_INSERT_ID() SQL 함수 또는 mysql_insert_id() C API 함수를 사용하여 최신 AUTO_INCREMENT 값을 검색할 수 있습니다.이러한 함수는 연결별로 다르므로 삽입을 수행하는 다른 연결에도 해당 반환 값이 영향을 받지 않습니다.
필요한 최대 시퀀스 값을 저장할 수 있을 정도로 큰 AUTO_INCREMENT 열에 가장 작은 정수 데이터 유형을 사용합니다.열이 데이터 유형의 상한에 도달하면 시퀀스 번호를 생성하려는 다음 시도는 실패합니다.가능한 경우 UNSIGNED 특성을 사용하여 더 큰 범위를 허용합니다.예를 들어 TINYINT를 사용하는 경우 허용되는 최대 시퀀스 번호는 127입니다.TINYINT UNSIGNED의 경우 최대값은 255입니다.모든 정수 유형의 범위는 섹션 11.2.1, "정수 유형(정확한 값) - 정수, INT, SMALLINT, TINENT, MEDIAINT, BIGINT"를 참조하십시오.
주 다중 행 삽입의 경우 LAST_INSERT_ID() 및 mysql_insert_id()는 실제로 삽입된 행 중 첫 번째 행에서 AUTO_INCREMENT 키를 반환합니다.이렇게 하면 복제 설정의 다른 서버에서 다중 행 삽입을 올바르게 복제할 수 있습니다.
AUTO_INCREMENT 열이 여러 인덱스의 일부인 경우 MySQL은 AUTO_INCREMENT 열로 시작하는 인덱스(있는 경우)를 사용하여 시퀀스 값을 생성합니다.예를 들어 동물 테이블에 PRIMARY KEY(grp, id) 및 INDEX(id) 인덱스가 포함된 경우 MySQL은 시퀀스 값을 생성하기 위해 PRIMARY KEY를 무시합니다.결과적으로 표에는 grp 값당 시퀀스가 아닌 단일 시퀀스가 포함됩니다.
1이 아닌 AUTO_INCREMENT 값으로 시작하려면 다음과 같이 CREATE TABLE 또는 ALTER TABLE을 사용하여 해당 값을 설정합니다.
mysql> ALTER TABLET AUTO_INCREMENT = 100; InnoDB Notes
InnoDB 테이블의 경우 INSERT 문 시퀀스 중간에 자동 증분 값이 포함된 열을 수정할 경우 주의하십시오.예를 들어 UPDATE 문을 사용하여 자동 증분 열에 더 큰 새 값을 입력하면 이후 INSERT에서 "항목 중복" 오류가 발생할 수 있습니다.자동 증분 값이 이미 있는지 테스트는 DELETE에 이어 더 많은 INSERT 문이 있거나 트랜잭션을 커밋할 때 발생하지만 UPDATE 문 이후에는 발생하지 않습니다.
My ISAM 노트
MyISAM 테이블의 경우 다중 열 인덱스의 보조 열에 AUTO_INCREMENT를 지정할 수 있습니다.이 경우 AUTO_INCREMENT 열에 대해 생성된 값은 MAX(auto_increment_column) + 1 WHERE 접두사=given-prefix로 계산됩니다.이 기능은 데이터를 순서가 지정된 그룹에 배치하려는 경우에 유용합니다.
CREATE TABLE animals ( grp ENUM('fish','mammal','bird') NOT NULL, id MEDIUMINT NOT NULL AUTO_INCREMENT, name CHAR(30) NOT NULL, PRIMARY KEY (grp,id) ) ENGINE=MyISAM; INSERT INTO animals (grp,name) VALUES ('mammal','dog'),('mammal','cat'), ('bird','penguin'),('fish','lax'),('mammal','whale'), ('bird','ostrich'); SELECT * FROM animals ORDER BY grp,id; Which returns: +--------+----+---------+ | grp | id | name | +--------+----+---------+ | fish | 1 | lax | | mammal | 1 | dog | | mammal | 2 | cat | | mammal | 3 | whale | | bird | 1 | penguin | | bird | 2 | ostrich | +--------+----+---------+
이 경우(AUTO_INCREMENT 열이 여러 열 인덱스의 일부인 경우), 모든 그룹에서 가장 큰 AUTO_INCREMENT 값을 가진 행을 삭제하면 AUTO_INCREMENT 값이 재사용됩니다.이는 일반적으로 AUTO_INCREMENT 값이 재사용되지 않는 MyISAM 테이블에서도 발생합니다.
추가 읽기
AUTO_INCREMENT에 대한 자세한 내용은 다음에서 확인할 수 있습니다.
열에 AUTO_INCREMENT 특성을 할당하는 방법:섹션 13.1.17, "CREATE TABLE 구문" 및 섹션 13.1.7, "ALTER TABLE 구문".
NO_AUTO_VALUE_ON_ZERO SQL 모드에 따라 AUTO_INCREMENT가 작동하는 방식:섹션 5.1.7, "서버 SQL 모드".
LAST_INSERT_ID() 함수를 사용하여 가장 최근의 AUTO_INCREMENT 값이 포함된 행을 찾는 방법:섹션 12.14, "정보 기능".
사용할 AUTO_INCREMENT 값 설정:섹션 5.1.4, "서버 시스템 변수".
AUTO_INCREMENT 및 복제:섹션 16.4.1.1, "복제 및 AUTO_INCREMENT".
복제에 사용할 수 있는 AUTO_INCREMENT 관련 서버 시스템 변수(auto_increment_increment 및 auto_increment_offset):섹션 5.1.4, "서버 시스템 변수".
http://search.oracle.com/search/search?q=auto_increment&group=Documentation&x=0&y=0
InnoDB를 사용한 이 예는 연동 쿼리를 사용하여 자체 카운터를 구현하는 방법을 보여줍니다.
http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
당신은 무엇을 위해 갭을 만들어야 합니까?아이디 예약?저는 시퀀스를 터치하는 대신 어떤 대가를 치르더라도 디자인을 "수정"하고 다른 모듈을 업데이트하고 싶습니다.
시퀀스를 명시적으로 늘리는 대신 각 id에 대해 기본 행(잘못 표시됨)을 삽입하여 id를 할당하고 반환합니다.이 접근 방식은 일관성 있고 휴대성이 뛰어납니다.나중에 명시적 시퀀스 값을 사용하여 삽입을 강제하는 대신 일치하는 시퀀스 값을 기준으로 이러한 기본 행을 업데이트할 수 있습니다.이를 위해서는 더 많은 메모리가 필요하지만 잠금은 필요하지 않습니다.만료된 행에 대한 가비지 컬렉션을 사용하면 도움이 됩니다.'insert or update' 문은 가비지 수집 행을 다시 만들 수 있지만, 나는 그렇게 하지 않을 것입니다.
http://www.microshell.com/database/mysql/emulating-nextval-function-to-get-sequence-in-mysql/ 에서 설명한 대로 MySQL 기능을 추가하여 다음과 같은 작업을 수행할 수 있습니다.
SELECT nextval('sq_my_sequence') as next_sequence;
은 MySQL을 사용합니다. »AUTO_INCREMENT
목적에 부합하는.그러나 다음과 같은 차이점이 있습니다.
MySQLAUTO_INCREMENT
오로로SEQUENCE
가 있습니다.
- AUTO_INCREMENT는 테이블당 하나의 열로 제한됩니다.
- AUTO_INCREMENT를 특정 table.column에 할당해야 합니다(다중 테이블 사용을 허용하지 않음).
- AUTO_INCREMENT가 지정되지 않은 열 또는 NULL 값으로 삽입되었습니다.
MySQL을 사용한 SEQUENCE 구현을 보려면 SP를 사용하십시오.
당신이 원하는 모든 것을 설명하는 아래 링크를 참조하세요.
http://ronaldbradford.com/blog/sequences-in-mysql-2006-01-26/
MariaDBs를 살펴봅니다.SEQUENCE
엔진.이를 통해 다음과 같이 쉽게 시퀀스를 생성할 수 있습니다.
SELECT seq FROM seq_1_to_5;
+-----+
| seq |
+-----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+-----+
자세한 내용은 https://mariadb.com/kb/en/mariadb/sequence/ 를 참조하십시오.
이것으로 당신은 다음과 같은 것을 할 수 있을 것입니다.
SELECT min(seq) as nextVal FROM seq_1_to_500
WHERE seq NOT IN (SELECT ID FROM customers)
자동 증분을 사용하는 다른 프로세스를 방해하지 않고 아직 삽입되지 않은 행을 만들 수 있도록 테이블의 다음 값을 원하십니까?
일부 옵션:
계속해서 "순서를 모두 사용"할 행을 삽입하고 보류 중으로 표시한 다음 나중에 업데이트하십시오.
트랜잭션에 삽입하고 트랜잭션을 중단합니다. 자동 번호 시퀀스가 모두 사용되고 테이블에 일반적으로 "갭"이 있어야 합니다. 이제 해당 번호를 사용할 수 있습니다.
Oracle에서는 시퀀스가 테이블과 완전히 독립적이므로 프로세스가 시퀀스를 사용할 수 있는지 여부에 관계없이 동일한 시퀀스를 다른 테이블에 사용할 수도 있습니다.그런 맥락에서, 어떤 종류의 기능을 통해 액세스하는 시퀀스 전용 테이블을 구현할 수 있으며, 자동 증분에 의존해야 하는 다른 프로세스의 경우 자동 증분을 제거하고 ID가 제공되지 않는 경우 동일한 시퀀스 기능에서 할당하는 트리거를 사용할 수 있습니다.
1.) create table query
2.) Insert query
3.) Update query
4.) Select query for that table e.g. SELECT next_val FROM hib_sequence;
5.) Before each select update first, like this you can achieve similar
-- CREATE TABLE hib_sequence (next_val INT NOT NULL);
-- UPDATE hib_sequence SET next_val=LAST_INSERT_ID(next_val+1);
-- select last_insert_id();
-- INSERT INTO hib_sequence VALUES (0);
-- select next_val from hib_sequence;
언급URL : https://stackoverflow.com/questions/9046971/mysql-equivalent-of-oracles-sequence-nextval
'programing' 카테고리의 다른 글
클래스의 Python 장식가 (0) | 2023.06.10 |
---|---|
소스 파일에도 'external C'를 추가해야 합니까? (0) | 2023.06.10 |
속성 'id'가 'T' 유형에 없습니다. (2339) 유형 스크립트 Generics 스크립트 Generics 오류 (0) | 2023.06.10 |
Python은 키 표시가 없는 경우 키 표시를 업데이트합니다. (0) | 2023.06.10 |
XML을 반환하는 WebAPI (0) | 2023.06.10 |