Подтвердить что ты не робот

Как создать уникальный идентификатор в MySQL?

Я программирую script с помощью PHP и MySQL, и я хочу получить уникальный id (состоящий из строки: capitals и small буквы с цифрами): gHYtUUi5b. Я нашел много функций в PHP, которые могут генерировать такие числа, но я боюсь, как обеспечить уникальный идентификатор!

UPDATE: uuid длинный, я имею в виду такой идентификатор, как: (P5Dc) 11 буквенно-цифровых char.

4b9b3361

Ответ 1

A программный путь может быть:

  • добавьте UNIQUE INDEX в поле
  • генерировать случайную строку в PHP
  • цикл в PHP (while (! DO_THE_INSERT))
    • создать другую строку

Примечание:

  • Это может быть грязно, но имеет преимущество DBMS-agnostic
  • Даже если вы решите использовать уникальную функцию генератора уникальных идентификаторов СУБД (UUID и т.д.), лучше убедиться, что поле HAS должно быть UNIQUE, используя индекс
  • цикл статистически не выполняется вообще, он вводится только при неудаче вставки

Ответ 2

Я использую UUID() для создания уникального значения.

Пример:

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

Ответ 3

Вам может понравиться то, как мы это делаем. Мне нужен обратимый уникальный код, который выглядел "случайным" - довольно распространенная проблема.

  • Мы берем входное число, например, 1942.
  • Вставьте его в строку: "0000001942"
  • Поместите последние две цифры на передний план: "4200000019"
  • Преобразуйте это в число: 4 200 000 019

Теперь у нас есть число, которое дико меняется между звонками и, как гарантируется, составляет менее 10 000 000 000. Неплохое начало.

  • Преобразуйте это число в строку Base 34: "2oevc0b"
  • Замените любые нули "y" и любыми "z": "2oevcyb"
  • Переключение на более высокий уровень: "2OEVCYB"

Причина выбора базы 34 заключается в том, что мы не беспокоимся о столкновениях 0/0 и 1/л. Теперь у вас есть короткий случайный ключ, который вы можете использовать для поиска идентификатора базы данных LONG.

Ответ 4

Как вы создаете уникальные_иды, это полезный вопрос, но вы, кажется, делаете встречное плодотворное предположение о том, когда вы их создаете!

Моя точка зрения заключается в том, что вам не нужно генерировать этот уникальный идентификатор во время создания ваших строк, поскольку они по существу не зависят от вставленных данных.

То, что я делаю, является предварительным генерированием уникального идентификатора для будущего использования, таким образом, я могу взять свое собственное сладкое время и абсолютно гарантировать, что они уникальны, и нет обработки, которая должна быть сделана во время вставки.

Например, у меня есть таблица заказов с order_id. Этот идентификатор генерируется "на лету", когда пользователь вводит порядок, постепенно 1,2,3 и т.д. Навсегда. Пользователь не должен видеть этот внутренний идентификатор.

Затем у меня есть другая таблица - unique_ids с (order_id, unique_id). У меня есть обычная программа, которая запускается каждую ночь, которая предварительно загружает эту таблицу с достаточным количеством строк unique_id, чтобы покрыть заказы, которые могут быть вставлены в следующие 24 часа. (Если я когда-либо получаю 10000 заказов за один день, у меня будет проблема - но это будет хорошая проблема!)

Этот подход гарантирует уникальность и отвлекает любую обработку от транзакции вставки и в пакетную процедуру, где она не влияет на пользователя.

Ответ 5

Если вы используете MySQL с версией выше 5.7.4, вы можете использовать недавно добавленную функцию RANDOM_BYTES:

 SELECT TO_BASE64(RANDOM_BYTES(16));

Это приведет к случайной строке, такой как GgwEvafNLWQ3+ockEST00A==.

Ответ 6

Используйте функцию UUID.

Я не знаю источник ваших процедур в PHP, который генерирует уникальные значения. Если это функция библиотеки, они должны гарантировать, что ваше значение действительно уникально. Проверьте документацию. Вы должны, hovwer, использовать эту функцию все время. Если вы, например, используете функцию 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

Для уникальности, что я делаю, я беру временную метку Unix и добавляю к ней случайную строку и использую ее.

Ответ 9

Ниже приведена только ссылка на числовой уникальный случайный идентификатор...

он может помочь вам...

$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;

и вы можете добавить char с кодом типа → $rand=mt_rand(10000,999999) .$randomchar; // assume $radomchar contains char;

Ответ 10

Вы также можете использовать crypt() *, чтобы создать [почти гарантированный] уникальный идентификатор внутри ваших противопоказаний.

Ответ 11

 <?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";
   ?>

Ответ 12

crypt() как предложено и сохранить соль в каком-либо файле конфигурации, Начните соль с 1, и если вы найдете дубликат перехода к следующему значению 2. Вы можете использовать 2 символа, но это даст вам достаточно комбинации для соли.

Вы можете создать строку из openssl_random_pseudo_bytes(8). Таким образом, это должно давать случайную и короткую строку (11 char) при запуске с crypt().

Удалите соль из результата, и будет только 11 символов, которые должны быть достаточно случайными для 100+ миллионов, если вы измените соль при каждом сбое случайного.

Ответ 13

Это генерирует случайные идентификаторы:

CREATE TABLE Persons (
    ID Integer PRIMARY KEY AUTOINCREMENT,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

Ответ 14

Чтобы получить уникальные и случайно выглядящие токены, вы можете просто зашифровать свой первичный ключ, т.е.

SELECT HEX(AES_ENCRYPT(your_pk,'your_password')) AS 'token' FROM your_table;

Это достаточно хорошо, плюс его обратимость, поэтому вам не нужно хранить этот токен в своей таблице, а генерировать его вместо этого.

Еще одним преимуществом является то, что после того, как вы расшифруете свою 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 для записи, которая еще не была вставлена ... Конечно, вы можете просто вставить INSERT а затем UPDATE с помощью LAST_INSERT_ID() но еще раз - есть лучшее решение:

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, python, js или любом другом языке, который вы можете использовать.