[SQL] 고유 번호 생성에는 mysql
SQL고유 번호 생성에는 mysql
난 그냥 깨끗한 MySQL이 정체성 (10000에서 99999까지) 고유의 임의의 정수를 생성 할; 어떤 아이디어?
내가 MySQL의 쿼리의 일부 지능형 솔루션을 사용하기를 원하기 때문에 - (> 데이터베이스에 확인 번호를 생성) 나는 자전거에 의해 PHP는이 번호를 생성하고 싶지 않아요.
해결법
-
==============================
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.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.나는 잠시 동안 여기에 솔루션 고투하고 열이 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.내가 가지고 올 수있는 유일한 절반 방법 합리적인 아이디어는 ID의 유한 풀과 테이블을 만드는 것입니다 그리고 그들은 그 테이블에서 제거에게 그것들을 사용한다. 그 키는 고유 수 있으며, 스크립트는 해당 테이블을 생성하기 위해 생성 될 수있다. 그런 다음 사용 가능한 키에서 임의의 선택을 생성하여 그 열쇠 중 하나를 당겨 수 있습니다. 나는 말했다 관대에 방법 당하고 정직하게 합리적이고 '절반 방법',하지만 당신은 내가 가정 고유 한을 만들 때까지 무작위 키를 생성 친다.
내가 가지고 올 수있는 유일한 절반 방법 합리적인 아이디어는 ID의 유한 풀과 테이블을 만드는 것입니다 그리고 그들은 그 테이블에서 제거에게 그것들을 사용한다. 그 키는 고유 수 있으며, 스크립트는 해당 테이블을 생성하기 위해 생성 될 수있다. 그런 다음 사용 가능한 키에서 임의의 선택을 생성하여 그 열쇠 중 하나를 당겨 수 있습니다. 나는 말했다 관대에 방법 당하고 정직하게 합리적이고 '절반 방법',하지만 당신은 내가 가정 고유 한을 만들 때까지 무작위 키를 생성 친다.
-
==============================
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.랜드 () 함수는 임의의 숫자를 생성하지만, 고유성을 보장하지 않습니다. 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.나는이 대답을 사용하려고하지만 원래의 질의을 약간 변경했다, 그래서 그것은 나를 위해 작동하지 않았다.
나는이 대답을 사용하려고하지만 원래의 질의을 약간 변경했다, 그래서 그것은 나를 위해 작동하지 않았다.
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.당신은 고유의 무작위 # 원하는 필드에 고유 인덱스를 생성
당신은 고유의 무작위 # 원하는 필드에 고유 인덱스를 생성
그런 다음 실행
업데이트 표를 무시 집합 RandomUniqueIntegerField = FLOOR (RAND () * 1000000);
-
==============================
9.나는 당신이하고 싶은 이유에 대해 걱정하지만 당신은 간단하게 사용할 수 있습니다 :
나는 당신이하고 싶은 이유에 대해 걱정하지만 당신은 간단하게 사용할 수 있습니다 :
SELECT FLOOR(RAND() * 1000000);
자세한 내용은 전체 MySQL의 RAND 설명서를 참조하십시오.
그러나, 나는 (이 당신이 계신 경우 적당하게 큰 부호없는 정수 필드에 AUTO_INCREMENT 속성을 사용) 고유 식별자로 이것을 사용하지 희망이 아니라 위해 MySQL을 사용 거라고 내가 왜 궁금해야 스크립트 언어. 당신은 무엇을 달성하려고?
from https://stackoverflow.com/questions/4382185/mysql-unique-number-generation by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SSIS에 대한 권장 학습 재료를 무엇입니까? [닫은] (0) | 2020.06.27 |
---|---|
[SQL] 가게 순위 위치로 MySQL의 업데이트 문 (0) | 2020.06.27 |
[SQL] 좋은 C 번호가되는 SQLException을 잡기 및 재 시도에 대한 코딩 스타일이란 (0) | 2020.06.27 |
[SQL] 여러 테이블에서 INSERT INTO 표 (0) | 2020.06.27 |
[SQL] 내가 한 번 사용 후 왜 내 CTE에 액세스 할 수 없습니다? (0) | 2020.06.27 |