복붙노트

[SPRING] 오라클의 SEQUENCE.NEXTVAL에 해당하는 MySQL

SPRING

오라클의 SEQUENCE.NEXTVAL에 해당하는 MySQL

다음 테이블에서 ID의 다음 값을 반환하는 쿼리를 생성 할 수 있어야합니다.

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
)

오라클에서는 시퀀스에서 NEXTVAL을 호출 할 수 있으며 다음 시퀀스를 제공합니다 (참고 : 테이블에 삽입하지 않아도 됨).

주위에 인터넷 검색 후 다음 쿼리를 사용하여 auto_increment 현재 값을 찾을 수 발견 :

SELECT Auto_increment 
FROM information_schema.tables 
WHERE table_name='animals';

문제는 값을 쿼리 할 때마다 값이 증가하기를 바랍니다. 오라클에서 nextval을 호출하면 테이블에 행을 삽입하지 않아도 시퀀스의 값이 증가합니다.

쿼리가 호출 된 마지막 시간과 항상 다른 값이 반환되도록 위 쿼리를 수정할 수있는 방법이 있습니까? 즉, Auto_increment는 점검 될 때마다 증가되고 조회에 사용될 때 새로운 값을 사용합니다.

JDBCTemplate을 사용하고 있으므로 한 쿼리에서 더 잘 수행 할 수 있습니다.

해결법

  1. ==============================

    1.InnoDB를 사용한이 예제는 연동 쿼리를 사용하여 자신의 카운터를 구현하는 방법을 보여줍니다.

    InnoDB를 사용한이 예제는 연동 쿼리를 사용하여 자신의 카운터를 구현하는 방법을 보여줍니다.

    http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

    갭을 만들기 위해 필요한 것은 무엇입니까? ID를 예약 하시겠습니까? 나는 디자인을 모든 비용으로 "수정"하고 시퀀스를 건드리지 않고 다른 모듈을 업데이트하려고합니다.

    순서를 명시 적으로 증가시키는 대신에 각 id에 할당하고 반환 할 기본 행 (유효하지 않음으로 표시)을 삽입하여 암시합니다. 이 접근 방식은 일관되고 이식 가능합니다. 나중에 명시적인 순차 값을 사용하여 삽입을 강제 실행하는 대신 일치하는 순차 값으로 이러한 기본 행을 업데이트 할 수 있습니다. 이렇게하려면 더 많은 메모리가 필요하지만 잠금은 필요하지 않습니다. 만료 된 행의 가비지 수집은 여기에서 도움이 될 수 있습니다. '삽입 또는 업데이트'문은 가비지 수집 행을 다시 만들 수 있지만이 작업은 수행하지 않습니다.

  2. ==============================

    2.http://docs.oracle.com/cd/E17952_01/refman-5.5-en/example-auto-increment.html

    http://docs.oracle.com/cd/E17952_01/refman-5.5-en/example-auto-increment.html

    3.6.9. AUTO_INCREMENT 사용

    AUTO_INCREMENT 속성을 사용하여 새로운 행에 대해 고유 한 ID를 생성 할 수 있습니다.

    AUTO_INCREMENT 컬럼에 값이 지정되지 않았기 때문에, MySQL은 시퀀스 번호를 자동으로 할당했다. 시퀀스 번호를 생성하기 위해 명시 적으로 NULL 또는 0을 열에 할당 할 수도 있습니다.

    LAST_INSERT_ID () SQL 함수 또는 mysql_insert_id () C API 함수를 사용하여 가장 최근의 AUTO_INCREMENT 값을 검색 할 수 있습니다. 이 함수는 연결에 따라 다르므로 삽입을 수행하는 다른 연결에 의해 반환 값이 영향을받지 않습니다.

    필요한 최대 시퀀스 값을 보유 할 수있을만큼 큰 AUTO_INCREMENT 컬럼에 가장 작은 정수 데이터 유형을 사용하십시오. C 럼이 데이터 유형의 상한에 도달하면, 순번을 생성하려는 다음 시도가 실패합니다. 가능하다면 더 넓은 범위를 허용하려면 UNSIGNED 속성을 사용하십시오. 예를 들어, TINYINT를 사용하면 최대 허용 시퀀스 번호는 127입니다. TINYINT UNSIGNED의 경우 최대 값은 255입니다. 11.2.1 절. "정수 유형 (정확한 값) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT "모든 정수 유형의 범위에 대해.

    노트 다중 행 삽입의 경우 LAST_INSERT_ID () 및 mysql_insert_id ()는 실제로 삽입 된 첫 번째 행에서 AUTO_INCREMENT 키를 반환합니다. 이렇게하면 복제 설정의 다른 서버에서 다중 행 삽입을 올바르게 재현 할 수 있습니다.

    AUTO_INCREMENT 컬럼이 다중 인덱스의 일부라면, MySQL은 AUTO_INCREMENT 컬럼으로 시작하는 인덱스를 사용하여 인덱스 값을 생성한다. 예를 들어, animals 테이블에 PRIMARY KEY (grp, id) 및 INDEX (id) 인덱스가 포함 된 경우 MySQL은 시퀀스 값 생성을위한 PRIMARY KEY를 무시합니다. 결과적으로 테이블에는 단일 시퀀스가 ​​포함되며 grp 값 당 시퀀스는 포함되지 않습니다.

    1이 아닌 AUTO_INCREMENT 값으로 시작하려면 다음과 같이 CREATE TABLE 또는 ALTER TABLE을 사용하여 해당 값을 설정하십시오.

    mysql> ALTER TABLE tbl AUTO_INCREMENT = 100; InnoDB Notes

    InnoDB 테이블의 경우, 일련의 INSERT 문의 중간에서 자동 증가 값을 포함하는 열을 수정하면주의해야한다. 예를 들어 UPDATE 문을 사용하여 자동 증가 열에 더 큰 새 값을 넣으면 후속 INSERT에 "중복 항목"오류가 발생할 수 있습니다. 자동 증가 값이 이미 존재하는지 테스트하는 것은 INSERT 문 다음에 DELETE를 수행 한 경우 또는 트랜잭션을 COMMIT 할 때 발생하지만 UPDATE 문 이후가 아니라면 발생합니다.

    MyISAM 메모

    MyISAM 테이블의 경우, 다중 컬럼 인덱스의 2 차 컬럼에 AUTO_INCREMENT를 지정할 수있다. 이 경우 AUTO_INCREMENT 열의 생성 된 값은 MAX (auto_increment_column) + 1 WHERE prefix = given-prefix로 계산됩니다. 데이터를 정렬 된 그룹에 넣으려는 경우에 유용합니다.

    이 경우 (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

  3. ==============================

    3.http://www.microshell.com/database/mysql/emulating-nextval-function-to-get-sequence-in-mysql/에 나와있는 것처럼 자신 만의 MySQL 함수를 추가하여 다음과 같은 작업을 수행 할 수 있습니다.

    http://www.microshell.com/database/mysql/emulating-nextval-function-to-get-sequence-in-mysql/에 나와있는 것처럼 자신 만의 MySQL 함수를 추가하여 다음과 같은 작업을 수행 할 수 있습니다.

    SELECT nextval('sq_my_sequence') as next_sequence;
    
  4. ==============================

    4.MySQL은 목적에 부합하는 AUTO_INCREMENT를 사용한다. 그러나 아래에는 차이점이 있습니다.

    MySQL은 목적에 부합하는 AUTO_INCREMENT를 사용한다. 그러나 아래에는 차이점이 있습니다.

    MySQL AUTO_INCREMENT에서 Oracle SEQUENCE 로의 차이점

    MySQL로 SEQUENCE 구현을보고 싶다면 SP로 할 수있다.

    아래 링크를 참조하여 원하는 모든 것을 설명하십시오.

    http://ronaldbradford.com/blog/sequences-in-mysql-2006-01-26/

  5. ==============================

    5.THAT 테이블의 다음 값을 원하면 자동 증가를 사용하는 다른 프로세스를 방해하지 않고 아직 삽입되지 않은 행을 만들 수 있습니까?

    THAT 테이블의 다음 값을 원하면 자동 증가를 사용하는 다른 프로세스를 방해하지 않고 아직 삽입되지 않은 행을 만들 수 있습니까?

    몇 가지 옵션 :

    계속해서 "시퀀스 사용"에 행을 삽입하고 보류로 표시 한 다음 나중에 업데이트하십시오.

    트랜잭션에 삽입하고 트랜잭션을 중단하십시오. 자동 번호 시퀀스가 ​​정상적으로 사용되어 테이블에 "간격"을 만들어야합니다.이 숫자는 이제 자유롭게 사용할 수 있습니다.

    오라클의 경우 시퀀스는 테이블과 완전히 독립적이므로 프로세스는 시퀀스를 사용할지 여부를 결정할 수 있습니다 (또한 테이블마다 다른 시퀀스를 사용할 수도 있습니다). 이 정맥에서는 어떤 종류의 기능을 통해 액세스하는 시퀀스 전용 테이블을 구현할 수 있으며 자동 증가에 의존해야하는 다른 프로세스의 경우 자동 증가를 제거하고 같은 값을 사용하는 트리거를 사용합니다 id가 제공되지 않으면 시퀀스 함수.

  6. ==============================

    6.MariaDBs SEQUENCE 엔진을 살펴보십시오. 그것으로 당신은 다음과 같이 쉬운 시퀀스를 생성 할 수 있습니다.

    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)
    
  7. ==============================

    7.

    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;
    
  8. ==============================

    8.오래된 질문이지만, 아마도 이것은 누군가를 도울 수 있습니다 ...

    오래된 질문이지만, 아마도 이것은 누군가를 도울 수 있습니다 ...

    다음은 PHP에서 약간의 도움을 받아 다음 ID를 수동으로 가져 오는 방법입니다 (그러나 실제로 모든 언어가이 기능을 제공 할 수 있습니다). 이것은 $ primaryKey가 AUTO_INCREMENT 컬럼이라고 가정합니다.

    public function NextId($table, $primaryKey)
    {
        $sql = "SELECT $primaryKey FROM $table ORDER BY $primaryKey DESC LIMIT 1";
    
        // execute, etc...
        $result = $row[0]
    
        $id = (int)$result;
        $id++;
    
        return $id;
    }
    
  9. from https://stackoverflow.com/questions/9046971/mysql-equivalent-of-oracles-sequence-nextval by cc-by-sa and MIT license