복붙노트

[SQL] 고유 번호 생성에는 mysql

SQL

고유 번호 생성에는 mysql

난 그냥 깨끗한 MySQL이 정체성 (10000에서 99999까지) 고유의 임의의 정수를 생성 할; 어떤 아이디어?

내가 MySQL의 쿼리의 일부 지능형 솔루션을 사용하기를 원하기 때문에 - (> 데이터베이스에 확인 번호를 생성) 나는 자전거에 의해 PHP는이 번호를 생성하고 싶지 않아요.

해결법

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

    1.그것은 다소 어색한 것 같지만,이 목표를 달성하기 위해 무엇을 할 수 있는지입니다 :

    그것은 다소 어색한 것 같지만,이 목표를 달성하기 위해 무엇을 할 수 있는지입니다 :

    SELECT FLOOR(10000 + RAND() * 89999) AS random_number
    FROM table
    WHERE random_number NOT IN (SELECT unique_id FROM table)
    LIMIT 1
    

    간단하게는, N은 테이블 행의 수 N 인 난수를 생성하고 테이블에 이미 존재들을 필터링하고, 나머지 하나에 제한 세트를 넣어.

    그것은 큰 테이블에 다소 느려질 수 있습니다. 속도 물건을하려면 다음과 같은 고유 ID에서보기를 만들고, 중첩 된 select 문 대신 사용할 수 있습니다.

    편집 : 제거 따옴표

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

    2.1M에 범위 1에서 무작위 ID 값에 일련 번호에서 룩업 테이블을 구축 :

    1M에 범위 1에서 무작위 ID 값에 일련 번호에서 룩업 테이블을 구축 :

    create table seed ( i int not null auto_increment primary key );
    insert into seed values (NULL),(NULL),(NULL),(NULL),(NULL),
                            (NULL),(NULL),(NULL),(NULL),(NULL);
    
    insert into seed select NULL from seed s1, seed s2, seed s3, seed s4, seed s5, seed s6;
    delete from seed where i < 100000;
    
    create table idmap ( n int not null auto_increment primary key, id int not null );
    insert into idmap select NULL, i from seed order by rand();
    
    drop table seed;
    
    select * from idmap limit 10;
    
    +----+--------+
    | n  | id     |
    +----+--------+
    |  1 | 678744 |
    |  2 | 338234 |
    |  3 | 469412 |
    |  4 | 825481 |
    |  5 | 769641 |
    |  6 | 680909 |
    |  7 | 470672 |
    |  8 | 574313 |
    |  9 | 483113 |
    | 10 | 824655 |
    +----+--------+
    10 rows in set (0.00 sec)
    

    (이 모두 내 컴퓨터에서 실행되도록 약 30 초 정도 걸립니다. 당신은 각 시퀀스 일단이 작업을 수행해야합니다.)

    이제 당신은 (다른 테이블에서 카운터 또는 AUTO_INCREMENT 키 필드) 사용되어왔다 얼마나 많은 추적, 매핑이있다.

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

    3.나는 잠시 동안 여기에 솔루션 고투하고 열이 NULL 항목이있는 경우 실패 깨달았다. 나는 다음과 같은 코드로이 재;

    나는 잠시 동안 여기에 솔루션 고투하고 열이 NULL 항목이있는 경우 실패 깨달았다. 나는 다음과 같은 코드로이 재;

    SELECT FLOOR(10000 + RAND() * 89999) AS my_tracker FROM Table1 WHERE "tracker" NOT IN (SELECT tracker FROM Table1 WHERE tracker IS NOT NULL) LIMIT 1
    

    여기 바이올린; http://sqlfiddle.com/#!2/620de1/1

    그 도움이 :) 희망

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

    4.내가 가지고 올 수있는 유일한 절반 방법 합리적인 아이디어는 ID의 유한 풀과 테이블을 만드는 것입니다 그리고 그들은 그 테이블에서 제거에게 그것들을 사용한다. 그 키는 고유 수 있으며, 스크립트는 해당 테이블을 생성하기 위해 생성 될 수있다. 그런 다음 사용 가능한 키에서 임의의 선택을 생성하여 그 열쇠 중 하나를 당겨 수 있습니다. 나는 말했다 관대에 방법 당하고 정직하게 합리적이고 '절반 방법',하지만 당신은 내가 가정 고유 한을 만들 때까지 무작위 키를 생성 친다.

    내가 가지고 올 수있는 유일한 절반 방법 합리적인 아이디어는 ID의 유한 풀과 테이블을 만드는 것입니다 그리고 그들은 그 테이블에서 제거에게 그것들을 사용한다. 그 키는 고유 수 있으며, 스크립트는 해당 테이블을 생성하기 위해 생성 될 수있다. 그런 다음 사용 가능한 키에서 임의의 선택을 생성하여 그 열쇠 중 하나를 당겨 수 있습니다. 나는 말했다 관대에 방법 당하고 정직하게 합리적이고 '절반 방법',하지만 당신은 내가 가정 고유 한을 만들 때까지 무작위 키를 생성 친다.

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

    5.CakePHP는 2.4.7에서 구현 내 솔루션은 하나 개의 AUTO_INCREMENT 유형 필드와 테이블을 만드는 것입니다

    CakePHP는 2.4.7에서 구현 내 솔루션은 하나 개의 AUTO_INCREMENT 유형 필드와 테이블을 만드는 것입니다

    CREATE TABLE `unique_counters` (
      `counter` int(11) NOT NULL AUTO_INCREMENT,
      `field` int(11) NOT NULL,
      PRIMARY KEY (`counter`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    

    새 레코드를 삽입 할 때마다, 생성 된 ID를 읽고 즉시 삭제하도록 나는 다음 PHP 함수를 만들었습니다. MySQL은 메모리 카운터 상태로 유지합니다. 생성 된 모든 번호는 MySQL의 카운터를 재설정 할 때까지 고유 또는 당신은 테이블 잘라 내기 작업을 실행

    모델을 검색 할 수 있습니다 모두를 구현하기 위해 CakePHP의에서 만든

    App::uses('AppModel', 'Model');
    /**
     * UniqueCounter Model
     *
     */
    class UniqueCounter extends AppModel {
    
    /**
     * Primary key field
     *
     * @var string
     */
        public $primaryKey = 'counter';
    
    /**
     * Validation rules
     *
     * @var array
     */
        public $validate = array(
            'counter' => array(
                'numeric' => array(
                    'rule' => array('numeric'),
                    //'message' => 'Your custom message here',
                    //'allowEmpty' => false,
                    //'required' => false,
                    //'last' => false, // Stop validation after this rule
                    //'on' => 'create', // Limit validation to 'create' or 'update' operations
                ),
            ),
        );
    
        public function get_unique_counter(){
            $data=array();
            $data['UniqueCounter']['counter']=0;
            $data['UniqueCounter']['field']=1;
    
            if($this->save($data)){
                $new_id=$this->getLastInsertID();
                $this->delete($new_id);
                return($new_id);
            }
            return(-1);
        }
    }
    

    결과 속하는 범위에 수표가 얻어진 결과를 조작함으로써, 동일한 기능으로 구현 될 수있다

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

    6.랜드 () 함수는 임의의 숫자를 생성하지만, 고유성을 보장하지 않습니다. MySQL의에 고유 식별자를 처리하는 적절한 방법은 AUTO_INCREMENT를 사용하여 선언하는 것입니다.

    랜드 () 함수는 임의의 숫자를 생성하지만, 고유성을 보장하지 않습니다. MySQL의에 고유 식별자를 처리하는 적절한 방법은 AUTO_INCREMENT를 사용하여 선언하는 것입니다.

    예를 들어, 다음 테이블의 id 필드는 삽입에 공급 될 필요가 없습니다, 그것은 항상 1 씩 증가합니다 :

    CREATE TABLE animal (
         id INT NOT NULL AUTO_INCREMENT,
         name CHAR(30) NOT NULL,
         PRIMARY KEY (id)
    );
    
  7. ==============================

    7.나는이 대답을 사용하려고하지만 원래의 질의을 약간 변경했다, 그래서 그것은 나를 위해 작동하지 않았다.

    나는이 대답을 사용하려고하지만 원래의 질의을 약간 변경했다, 그래서 그것은 나를 위해 작동하지 않았다.

    SELECT FLOOR(1000 + RAND() * 89999) AS random_number
    FROM Table
    WHERE NOT EXISTS (SELECT ID FROM Table WHERE Table.ID=random_number) LIMIT 1
    
  8. ==============================

    8.당신은 고유의 무작위 # 원하는 필드에 고유 인덱스를 생성

    당신은 고유의 무작위 # 원하는 필드에 고유 인덱스를 생성

    그런 다음 실행

    업데이트 표를 무시 집합 RandomUniqueIntegerField = FLOOR (RAND () * 1000000);

  9. ==============================

    9.나는 당신이하고 싶은 이유에 대해 걱정하지만 당신은 간단하게 사용할 수 있습니다 :

    나는 당신이하고 싶은 이유에 대해 걱정하지만 당신은 간단하게 사용할 수 있습니다 :

    SELECT FLOOR(RAND() * 1000000);
    

    자세한 내용은 전체 MySQL의 RAND 설명서를 참조하십시오.

    그러나, 나는 (이 당신이 계신 경우 적당하게 큰 부호없는 정수 필드에 AUTO_INCREMENT 속성을 사용) 고유 식별자로 이것을 사용하지 희망이 아니라 위해 MySQL을 사용 거라고 내가 왜 궁금해야 스크립트 언어. 당신은 무엇을 달성하려고?

  10. from https://stackoverflow.com/questions/4382185/mysql-unique-number-generation by cc-by-sa and MIT license