복붙노트

[SQL] 자동 증가는 자동 증가 필드없이 데이터베이스에 필드

SQL

자동 증가는 자동 증가 필드없이 데이터베이스에 필드

MS에서 SQL Server는 쉽게 자동 증가 필드를 만들 수있다. 내 시스템에서 나는 차 키의 자동 증가 필드를 사용 중지, 지금은 가이 드의를 사용합니다. 그것은 굉장했다, 그 변화에 많은 장점을 가지고있다. 그러나 다른 비 기본 키 필드에, 정말 "소프트 자동 증가"를 구현할 필요했다. 내 시스템이 DB에 독립적이기 때문에 나는 C #에서 프로그래밍 방식 자동 증가 (Autoinc) 값을 만들 수 있도록 그것은이다.

나는 자동 증가없이 데이터베이스에 자동 증가 필드에 대한 솔루션, 어떤 솔루션 사용에 그 이유에 대해 하시겠습니까? 이것에 대해 일부는 SQL 안시 문이있다? 그리고 내 C #에서 직접 생성, 더 나은 솔루션은?

PS : 나는 그것을 친화적 정말 동시 아니라 테이블에서 +1이 선택 최대 (ID)를 알고 ...

해결법

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

    1.고유 ID 값을 생성하는 메커니즘은 트랜잭션 격리의 대상이 될 수 없습니다. 이것은 더 나은 두 클라이언트가 동시에 새 ID 값을 할당하려고하면 경쟁 조건을 초래 SELECT MAX (ID) 테이블에서 하나의 트릭보다 각 클라이언트에 대해 고유 한 값을 생성하기 위해 데이터베이스가 필요합니다.

    고유 ID 값을 생성하는 메커니즘은 트랜잭션 격리의 대상이 될 수 없습니다. 이것은 더 나은 두 클라이언트가 동시에 새 ID 값을 할당하려고하면 경쟁 조건을 초래 SELECT MAX (ID) 테이블에서 하나의 트릭보다 각 클라이언트에 대해 고유 한 값을 생성하기 위해 데이터베이스가 필요합니다.

    당신은 (당신이 테이블 잠금 또는 직렬화 트랜잭션을 사용하지 않는 한) 표준 SQL 쿼리를 사용하여이 작업을 시뮬레이션 할 수 있습니다. 이 데이터베이스 엔진에 내장 된 메커니즘 수 있습니다.

    ANSI SQL은 SQL 때까지 대리 키에 대한 고유 한 값을 생성하는 작업을 설명하지 않았다 : 2003. 그 전에, 그래서 거의 RDBMS의 모든 브랜드는 몇 가지 독점적 인 솔루션을 제공, 자동 증가 컬럼에 대한 표준이 없었다. 당연히 그들이 많이 변화하고, 간단한, 데이터베이스 독립적 인 방식으로 사용할 수있는 방법은 없습니다.

    이러한 모든 메커니즘은 동시 클라이언트가 고유 한 값을 얻을 보장 외부 트랜잭션 격리를 운영하고 있습니다. 또한 모든 경우에 대비하여 현재의 세션에 대한 가장 최근에 생성 된 값을 조회하는 방법이있다. 당신이 자식 테이블에 행을 삽입하는 데 사용할 수 있도록이 있어야한다.

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

    2.나는 당신의 질문은 사실은 꽤 좋은 하나라고 생각합니다. 그러나, SQL 유일한 해결책을 마련하려고 길을 잃기 쉽다. 현실에서 당신은 자동 증가 유형의 데이터베이스 구현을 사용하여 제공되는 최적화 및 거래 안전을 원할 것입니다.

    나는 당신의 질문은 사실은 꽤 좋은 하나라고 생각합니다. 그러나, SQL 유일한 해결책을 마련하려고 길을 잃기 쉽다. 현실에서 당신은 자동 증가 유형의 데이터베이스 구현을 사용하여 제공되는 최적화 및 거래 안전을 원할 것입니다.

    당신이 자동 증가 연산자의 구현에서 추상해야하는 경우, 왜 자동 증가 값을 반환하는 저장 프로 시저를 만들 수 없습니다. 대부분의 SQL 언어는 상대적으로 같은 방식으로 저장 프로 시저를 액세스하고 더 휴대용해야한다. 당신이 SPROC를 만들 때 그런 다음 데이터베이스 특정의 자동 증가 논리를 만들 수 있습니다 - 벤더 구체적으로 많은 문을 변경할 필요가 없습니다.

    이 방법으로 완료, 당신의 삽입은 간단하게 할 수 있습니다 :

    INSERT INTO foo (id, name, rank, serial_number)
     VALUES (getNextFooId(), 'bar', 'fooRank', 123456);
    

    데이터베이스가 초기화 될 때 다음 데이터베이스 특정 방식으로 getNextFooId ()를 정의합니다.

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

    3.SQL Server와 같은 자동 증가 필드가없는 대부분의 데이터베이스는 (I 구체적으로 오라클을 생각하고) 당신이 다음 수에 대한 순서를 요청 시퀀스를 가지고있다. 많은 사람들이 동시에 모두에 번호를 요청하는 방법에 상관없이 고유 번호를 가져옵니다.

    SQL Server와 같은 자동 증가 필드가없는 대부분의 데이터베이스는 (I 구체적으로 오라클을 생각하고) 당신이 다음 수에 대한 순서를 요청 시퀀스를 가지고있다. 많은 사람들이 동시에 모두에 번호를 요청하는 방법에 상관없이 고유 번호를 가져옵니다.

  4. ==============================

    4.기존의 솔루션은 다음과 같이 보일 ID의 테이블을 가지고있다

    기존의 솔루션은 다음과 같이 보일 ID의 테이블을 가지고있다

    CREATE TABLE ids (
      tablename VARCHAR(32) NOT NULL PRIMARY KEY,
      nextid INTEGER
    )
    

    데이터베이스를 만들 때 이는 테이블 당 하나의 행으로 채워 s의.

    그런 다음, 당신이에 삽입하는 테이블의 다음 다음 ID를 얻을 수를 증가 다음 새 ID로 테이블을 업데이트 할 선택을한다. 물론, 잠금 문제가 여기에있다,하지만 중간 삽입 속도로 데이터베이스에 그것을 잘 작동합니다. 그리고 그것은 완전히 휴대용입니다.

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

    5.당신이 arbitraty 시퀀스를 생성하기위한 기본이 아닌 키 자동 증가 필드, 아주 좋은 MySQL의 유일한 해결책이 필요하면 상대적으로 알려지지 않은 LAST_INSERT_ID (EXPR) 함수를 사용하는 것입니다.

    당신이 arbitraty 시퀀스를 생성하기위한 기본이 아닌 키 자동 증가 필드, 아주 좋은 MySQL의 유일한 해결책이 필요하면 상대적으로 알려지지 않은 LAST_INSERT_ID (EXPR) 함수를 사용하는 것입니다.

    (행 http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id)

    여기에 두 번째 순서는 각 게시물에 대한 의견을 번호 보관 할 수있는 방법을 보여줍니다 예입니다 :

    CREATE TABLE  `post` (
      `id` INT(10) UNSIGNED NOT NULL,
      `title` VARCHAR(100) NOT NULL,
      `comment_sequence` INT(10) UNSIGNED NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    );
    
    CREATE TABLE  `comment` (
      `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      `post_id`  INT(10) UNSIGNED NOT NULL,
      `sequence` INT(10) UNSIGNED NOT NULL,
      `content` TEXT NOT NULL,
      PRIMARY KEY (`id`)
    );
    
    INSERT INTO post(id, title) VALUES(1, 'first post');
    INSERT INTO post(id, title) VALUES(2, 'second post');
    
    UPDATE post SET comment_sequence=Last_insert_id(comment_sequence+1) WHERE id=1;
    INSERT INTO `comment`(post_id, sequence, content) VALUES(1, Last_insert_id(), 'blah');
    
    UPDATE post SET comment_sequence=Last_insert_id(comment_sequence+1) WHERE id=1;
    INSERT INTO `comment`(post_id, sequence, content) VALUES(1, Last_insert_id(), 'foo');
    
    UPDATE post SET comment_sequence=Last_insert_id(comment_sequence+1) WHERE id=1;
    INSERT INTO `comment`(post_id, sequence, content) VALUES(1, Last_insert_id(), 'bar');
    
    UPDATE post SET comment_sequence=Last_insert_id(comment_sequence+1) WHERE id=2;
    INSERT INTO `comment`(post_id, sequence, content) VALUES(2, Last_insert_id(), 'lorem');
    
    UPDATE post SET comment_sequence=Last_insert_id(comment_sequence+1) WHERE id=2;
    INSERT INTO `comment`(post_id, sequence, content) VALUES(2, Last_insert_id(), 'ipsum');
    
    SELECT * FROM post;
    SELECT * FROM comment;
    
  6. from https://stackoverflow.com/questions/526460/autoincrement-fields-on-databases-without-autoincrement-field by cc-by-sa and MIT license