복붙노트

[SQL] 어떻게 MySQL의에 고유 ID를 생성하는?

SQL

어떻게 MySQL의에 고유 ID를 생성하는?

나는 PHP와 MySQL을 사용하여 스크립트 프로그래밍 그리고 난이를 얻으려면 고유 ID (문자열로 구성 : 자본과 작은 gHYtUUi5b : 같은 숫자와 문자). 나는 그런 숫자를 생성 할 수 PHP에서 많은 기능을 발견하지만 ID가 고유 확인하는 방법에 대한 유감!

UPDATE : (P5Dc) 11 영숫자 문자 : UUID 긴, 내가 좋아하는 같은 ID를 의미한다.

해결법

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

    1.프로그래밍 방식 방법은 할 수 있습니다 :

    프로그래밍 방식 방법은 할 수 있습니다 :

    노트 :

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

    2.나는 고유 한 값을 생성하는 UUID ()를 사용합니다.

    나는 고유 한 값을 생성하는 UUID ()를 사용합니다.

    예:

    insert into Companies (CompanyID, CompanyName) Values(UUID(), "TestUUID");
    
  3. ==============================

    3.당신은 우리가 그것을하는 방식을하실 수 있습니다. 나는 -a 매우 일반적인 문제를 "임의"보고 가역 고유 코드를 원했다.

    당신은 우리가 그것을하는 방식을하실 수 있습니다. 나는 -a 매우 일반적인 문제를 "임의"보고 가역 고유 코드를 원했다.

    우리는 지금 호출 사이에 격렬하게 변화하고 10,000,000,000 이하로 보장 번호를 가지고있다. 나쁜 시작.

    베이스 (34)를 선택하는 이유는 우리가 0 / O 및 1 / ℓ의 충돌에 대한 걱정을하지 않도록합니다. 지금 당신은 당신이 LONG 데이터베이스 식별자를 검색하는 데 사용할 수있는 짧은 무작위로 보이는 키가 있습니다.

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

    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.당신이 5.7.4보다 높은 버전의 MySQL을 사용하는 경우에는 새로 추가 된 RANDOM_BYTES 기능을 사용할 수 있습니다 :

    당신이 5.7.4보다 높은 버전의 MySQL을 사용하는 경우에는 새로 추가 된 RANDOM_BYTES 기능을 사용할 수 있습니다 :

     SELECT TO_BASE64(RANDOM_BYTES(16));
    

    이것은 == GgwEvafNLWQ3 + ockEST00A 같은 임의의 문자열 발생합니다.

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

    6.사용 UUID 기능.

    사용 UUID 기능.

    나는 고유 한 값을 생성 PHP에서 절차의 원인을 알 수 없습니다. 이 라이브러리 함수 인 경우 그들은 당신의 값이 정말 독특하다는 것을 보장해야한다. 문서에서 확인하십시오. 당신은 hovewer는이 기능을 항상 사용해야합니다. 당신은, 예를 들어, 사용 PHP 함수는 고유 한 값을 생성 한 다음 MySQL의 기능을 사용하기로 결정한 경우, 당신은 이미 존재하는 값을 생성 할 수 있습니다. 컬럼에 UNIQUE INDEX 퍼팅이 경우 또한 좋은 아이디어이다.

  7. ==============================

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

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

    9.고유성을 위해 내가하는 일은 내가 유닉스 타임 스탬프를 가지고 그것을 임의의 문자열을 추가하고를 사용합니다.

    고유성을 위해 내가하는 일은 내가 유닉스 타임 스탬프를 가지고 그것을 임의의 문자열을 추가하고를 사용합니다.

  10. ==============================

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

    11.토굴 () 제안과 일부 구성 파일에 저장 소금, 1에서 시작 소금, 당신은 당신이 개 문자를 사용하여 다음 값 2. 중복 이동을 찾을 수 있지만, 소금 당신에게 충분한 조합을 제공됩니다.

    토굴 () 제안과 일부 구성 파일에 저장 소금, 1에서 시작 소금, 당신은 당신이 개 문자를 사용하여 다음 값 2. 중복 이동을 찾을 수 있지만, 소금 당신에게 충분한 조합을 제공됩니다.

    당신은 openssl_random_pseudo_bytes (8)에서 캐릭터를 생성 할 수 있습니다. 토굴로 실행할 때이 임의의 짧은 문자열 (11 문자)를 제공해야합니다 그래서 ().

    제거 결과에서 소금과 당신이 모든에 소금을 변경 임의 실패 할 경우 충분한 100+ 수백만 임의해야에만 11 문자가있을 것입니다.

  12. ==============================

    12.당신은 또한 당신의 제약 조건 내부 [거의-보장] 고유 ID를 생성하기 위해 토굴 () *를 사용하는 것이 좋습니다.

    당신은 또한 당신의 제약 조건 내부 [거의-보장] 고유 ID를 생성하기 위해 토굴 () *를 사용하는 것이 좋습니다.

  13. ==============================

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

    14.당신은 트위터의 눈송이를 사용할 수 있습니다.

    당신은 트위터의 눈송이를 사용할 수 있습니다.

    즉, 그것은 시간, 서버 ID 및 시퀀스에 기초하여 고유 ID를 생성한다. 꽤 작고 그것이 INT64에 맞도록이 64 비트 값을 생성한다. 또한 제대로 값을 정렬 할 수 있습니다.

    https://developer.twitter.com/en/docs/basics/twitter-ids

    결론적으로, 이는 다수의 서버, 높은 동시성 정렬 값 및 64 비트 모두를 허용한다.

    여기에는 MySQL을위한 구현입니다

    https://github.com/EFTEC/snowflake-mysql

    그것은 기능과 테이블로 구성되어 있습니다.

  15. ==============================

    15.이것은 임의 ID를 생성합니다 :

    이것은 임의 ID를 생성합니다 :

    CREATE TABLE Persons (
        ID Integer PRIMARY KEY AUTOINCREMENT,
        LastName varchar(255) NOT NULL,
        FirstName varchar(255),
        Age int
    );
    
  16. from https://stackoverflow.com/questions/1467581/how-to-generate-unique-id-in-mysql by cc-by-sa and MIT license