[SQL] 어떻게 MySQL의에 고유 ID를 생성하는?
SQL어떻게 MySQL의에 고유 ID를 생성하는?
나는 PHP와 MySQL을 사용하여 스크립트 프로그래밍 그리고 난이를 얻으려면 고유 ID (문자열로 구성 : 자본과 작은 gHYtUUi5b : 같은 숫자와 문자). 나는 그런 숫자를 생성 할 수 PHP에서 많은 기능을 발견하지만 ID가 고유 확인하는 방법에 대한 유감!
UPDATE : (P5Dc) 11 영숫자 문자 : UUID 긴, 내가 좋아하는 같은 ID를 의미한다.
해결법
-
==============================
1.프로그래밍 방식 방법은 할 수 있습니다 :
프로그래밍 방식 방법은 할 수 있습니다 :
노트 :
-
==============================
2.나는 고유 한 값을 생성하는 UUID ()를 사용합니다.
나는 고유 한 값을 생성하는 UUID ()를 사용합니다.
예:
insert into Companies (CompanyID, CompanyName) Values(UUID(), "TestUUID");
-
==============================
3.당신은 우리가 그것을하는 방식을하실 수 있습니다. 나는 -a 매우 일반적인 문제를 "임의"보고 가역 고유 코드를 원했다.
당신은 우리가 그것을하는 방식을하실 수 있습니다. 나는 -a 매우 일반적인 문제를 "임의"보고 가역 고유 코드를 원했다.
우리는 지금 호출 사이에 격렬하게 변화하고 10,000,000,000 이하로 보장 번호를 가지고있다. 나쁜 시작.
베이스 (34)를 선택하는 이유는 우리가 0 / O 및 1 / ℓ의 충돌에 대한 걱정을하지 않도록합니다. 지금 당신은 당신이 LONG 데이터베이스 식별자를 검색하는 데 사용할 수있는 짧은 무작위로 보이는 키가 있습니다.
-
==============================
4.당신은 어떻게 unique_ids을 생성하는 유용한 질문입니다 -하지만 당신은 당신이 그들을 생성시기에 대한 카운터 생산적인 가정을 만드는 것 같다!
당신은 어떻게 unique_ids을 생성하는 유용한 질문입니다 -하지만 당신은 당신이 그들을 생성시기에 대한 카운터 생산적인 가정을 만드는 것 같다!
제 요점은 데이터가 삽입되는 본질적으로 독립적 때문에, 이러한 고유 ID의 당신의 행을 만들어시를 생성 할 필요가 없다는 것입니다.
내가 할 것은, 향후 사용을 위해 내 자신의 달콤한 시간을 절대적으로 그들이 고유 보장 할 수있는 방법을 고유 ID의 사전 생성하고, 삽입시 수행 할 처리가 없습니다.
예를 들어 나는 그것에 ORDER_ID과 주문 테이블을 가지고있다. 사용자가 점진적으로 영원히 1,2,3 등 순서를 입력하면이 ID는 즉석에서 생성됩니다. 사용자는이 내부 ID를 참조 할 필요가 없습니다.
그럼 난 다른 테이블이 - (ORDER_ID, UNIQUE_ID)와 unique_ids을. 나는 이상 덮개에 24 시간에 삽입 할 수있는 주문을 충분히 UNIQUE_ID 행이 테이블 부하를 사전에 매일 밤을 실행하는 루틴을 가지고있다. (내가 하루에 만 개 주문을받을 경우 내가 문제가있는 것입니다 -하지만 좋은 문제를 가지고하는 것입니다!)
이러한 접근 보장은 고유성과 삽입 거래에서하고 사용자에 영향을주지 않습니다 배치 루틴으로 떨어진 처리 부하가 걸립니다.
-
==============================
5.당신이 5.7.4보다 높은 버전의 MySQL을 사용하는 경우에는 새로 추가 된 RANDOM_BYTES 기능을 사용할 수 있습니다 :
당신이 5.7.4보다 높은 버전의 MySQL을 사용하는 경우에는 새로 추가 된 RANDOM_BYTES 기능을 사용할 수 있습니다 :
SELECT TO_BASE64(RANDOM_BYTES(16));
이것은 == GgwEvafNLWQ3 + ockEST00A 같은 임의의 문자열 발생합니다.
-
==============================
6.사용 UUID 기능.
사용 UUID 기능.
나는 고유 한 값을 생성 PHP에서 절차의 원인을 알 수 없습니다. 이 라이브러리 함수 인 경우 그들은 당신의 값이 정말 독특하다는 것을 보장해야한다. 문서에서 확인하십시오. 당신은 hovewer는이 기능을 항상 사용해야합니다. 당신은, 예를 들어, 사용 PHP 함수는 고유 한 값을 생성 한 다음 MySQL의 기능을 사용하기로 결정한 경우, 당신은 이미 존재하는 값을 생성 할 수 있습니다. 컬럼에 UNIQUE INDEX 퍼팅이 경우 또한 좋은 아이디어이다.
-
==============================
7.
DELIMITER $$ USE `temp` $$ DROP PROCEDURE IF EXISTS `GenerateUniqueValue`$$ CREATE PROCEDURE `GenerateUniqueValue`(IN tableName VARCHAR(255),IN columnName VARCHAR(255)) BEGIN DECLARE uniqueValue VARCHAR(8) DEFAULT ""; DECLARE newUniqueValue VARCHAR(8) DEFAULT ""; WHILE LENGTH(uniqueValue) = 0 DO SELECT CONCAT(SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1), SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1), SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1), SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1), SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1), SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1), SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1), SUBSTRING('ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789', RAND()*34+1, 1) ) INTO @newUniqueValue; SET @rcount = -1; SET @query=CONCAT('SELECT COUNT(*) INTO @rcount FROM ',tableName,' WHERE ',columnName,' like ''',newUniqueValue,''''); PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt; IF @rcount = 0 THEN SET uniqueValue = @newUniqueValue ; END IF ; END WHILE ; SELECT uniqueValue; END$$ DELIMITER ;
그리고 GenerateUniqueValue ( 'TABLENAME', 'COLUMNNAME')와 같은 저장 프로 시저를 호출합니다. 이렇게하면 8 자리의 고유 문자마다를 줄 것이다.
-
==============================
8.아래는 단지 숫자 고유 한 임의 ID의 참조 용입니다 ...
아래는 단지 숫자 고유 한 임의 ID의 참조 용입니다 ...
그것은 당신이 도움이 될 수 있습니다 ...
$query=mysql_query("select * from collectors_repair"); $row=mysql_num_rows($query); $ind=0; if($row>0) { while($rowids=mysql_fetch_array($query)) { $already_exists[$ind]=$rowids['collector_repair_reportid']; } } else { $already_exists[0]="nothing"; } $break='false'; while($break=='false'){ $rand=mt_rand(10000,999999); if(array_search($rand,$alredy_exists)===false){ $break='stop'; }else{ } } echo "random number is : ".$echo;
당신은 같은 코드 문자를 추가 할 수 있습니다 -> $ 랜드 =에는, mt_rand (10000,999999) $ randomchar.; // $ radomchar가 문자를 포함한다고 가정 해 봅시다;
-
==============================
9.고유성을 위해 내가하는 일은 내가 유닉스 타임 스탬프를 가지고 그것을 임의의 문자열을 추가하고를 사용합니다.
고유성을 위해 내가하는 일은 내가 유닉스 타임 스탬프를 가지고 그것을 임의의 문자열을 추가하고를 사용합니다.
-
==============================
10.
<?php $hostname_conn = "localhost"; $database_conn = "user_id"; $username_conn = "root"; $password_conn = ""; $conn = mysql_pconnect($hostname_conn, $username_conn, $password_conn) or trigger_error(mysql_error(),E_USER_ERROR); mysql_select_db($database_conn,$conn); // run an endless loop while(1) { $randomNumber = rand(1, 999999);// generate unique random number $query = "SELECT * FROM tbl_rand WHERE the_number='".mysql_real_escape_string ($randomNumber)."'"; // check if it exists in database $res =mysql_query($query,$conn); $rowCount = mysql_num_rows($res); // if not found in the db (it is unique), then insert the unique number into data_base and break out of the loop if($rowCount < 1) { $con = mysql_connect ("localhost","root"); mysql_select_db("user_id", $con); $sql = "insert into tbl_rand(the_number) values('".$randomNumber."')"; mysql_query ($sql,$con); mysql_close ($con); break; } } echo "inserted unique number into Data_base. use it as ID"; ?>
-
==============================
11.토굴 () 제안과 일부 구성 파일에 저장 소금, 1에서 시작 소금, 당신은 당신이 개 문자를 사용하여 다음 값 2. 중복 이동을 찾을 수 있지만, 소금 당신에게 충분한 조합을 제공됩니다.
토굴 () 제안과 일부 구성 파일에 저장 소금, 1에서 시작 소금, 당신은 당신이 개 문자를 사용하여 다음 값 2. 중복 이동을 찾을 수 있지만, 소금 당신에게 충분한 조합을 제공됩니다.
당신은 openssl_random_pseudo_bytes (8)에서 캐릭터를 생성 할 수 있습니다. 토굴로 실행할 때이 임의의 짧은 문자열 (11 문자)를 제공해야합니다 그래서 ().
제거 결과에서 소금과 당신이 모든에 소금을 변경 임의 실패 할 경우 충분한 100+ 수백만 임의해야에만 11 문자가있을 것입니다.
-
==============================
12.당신은 또한 당신의 제약 조건 내부 [거의-보장] 고유 ID를 생성하기 위해 토굴 () *를 사용하는 것이 좋습니다.
당신은 또한 당신의 제약 조건 내부 [거의-보장] 고유 ID를 생성하기 위해 토굴 () *를 사용하는 것이 좋습니다.
-
==============================
13.당신이 당신의 기본 키의 즉를 암호화 할 수 독특하고 찾고 임의의 토큰을 얻으려면 :
당신이 당신의 기본 키의 즉를 암호화 할 수 독특하고 찾고 임의의 토큰을 얻으려면 :
SELECT HEX (AES_ENCRYPT (your_pk '사용자 _')) AS '토큰'your_table FROM;
당신이 가게에가없는 것 테이블에 토큰이 대신을 생성 할 수 있도록이 충분한 플러스의 가역입니다.
또 다른 장점은 당신이 당신의 표하지만, 간단하고 빠른 PK 검색을 통해 무거운 전체 텍스트 검색을 할 필요가 없습니다 토큰 당신이에서 PK를 해독 한 번입니다.
프로그래머 하나의 작은 문제가 있지만. MySQL은 경우가 완전히 된 토큰이 쓸모 만드는 토큰 공간을 변경합니다 변경 다른 블록 암호화 모드를 지원합니다 ...
토큰 생성 즉 전에 변수를 설정할 수 있습니다 이것을 극복하기 :
SET block_encryption_mode = 'AES-256-CBC';
그러나 비트 낭비한다는 ... 이에 대한 해결책은 토큰에 마커를 사용하여 암호화 모드를 부착한다 :
SELECT CONCAT(CONV(CRC32(@@GLOBAL.block_encryption_mode),10,35),'Z',HEX(AES_ENCRYPT(your_pk,'your_password'))) AS 'token' FROM your_table;
당신이 INSERT에 테이블에 그 토큰을 유지하고자하는 경우 아직 삽입되지 않은 레코드에 대한 primary_key와 알 필요를 생성 할 수 있기 때문에 또 다른 문제는 ... 올 수도 당연히 당신 수도 방금 삽입 한 다음 LAST_INSERT_ID와 UPDATE ()하지만, 다시 - 더 나은 솔루션 프로그래머 :
INSERT INTO your_table ( token ) SELECT CONCAT(CONV(CRC32(@@GLOBAL.block_encryption_mode),10,35),'Z',HEX(AES_ENCRYPT(your_pk,'your_password'))) AS 'token' FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = "your_table";
이 솔루션의 하나 마지막으로 장점은 쉽게 PHP, 파이썬, JS 또는 사용할 수있는 다른 언어로 그것을 복제 할 수 있습니다.
-
==============================
14.당신은 트위터의 눈송이를 사용할 수 있습니다.
당신은 트위터의 눈송이를 사용할 수 있습니다.
즉, 그것은 시간, 서버 ID 및 시퀀스에 기초하여 고유 ID를 생성한다. 꽤 작고 그것이 INT64에 맞도록이 64 비트 값을 생성한다. 또한 제대로 값을 정렬 할 수 있습니다.
https://developer.twitter.com/en/docs/basics/twitter-ids
결론적으로, 이는 다수의 서버, 높은 동시성 정렬 값 및 64 비트 모두를 허용한다.
여기에는 MySQL을위한 구현입니다
https://github.com/EFTEC/snowflake-mysql
그것은 기능과 테이블로 구성되어 있습니다.
-
==============================
15.이것은 임의 ID를 생성합니다 :
이것은 임의 ID를 생성합니다 :
CREATE TABLE Persons ( ID Integer PRIMARY KEY AUTOINCREMENT, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int );
from https://stackoverflow.com/questions/1467581/how-to-generate-unique-id-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 업데이트 트리거 만 수정하기 필드 (0) | 2020.05.02 |
---|---|
[SQL] 유효성 검사 SQL 스크립트 코드 (0) | 2020.05.01 |
[SQL] 집계 함수와 SQL GROUP BY CASE 문 (0) | 2020.05.01 |
[SQL] 하나 개의 출력을위한 두 개의 테이블을 결합 (0) | 2020.05.01 |
[SQL] SSIS 패키지는 임시 테이블의 메타 데이터를 가져 싶지 않다 (0) | 2020.05.01 |