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

Добавил пользователь Дмитрий К.
Обновлено: 10.09.2024

Оператор SQL DISTINCT используется для указания на то, что следует работать только с уникальными значениями столбца.

Оператор SQL DISTINCT нашел широкое применение в операторе SQL SELECT, для выборки уникальных значений. Так же используется в агрегатных функциях.

Синтаксис

Примеры

Все примеры будут по этой таблице workers, если не сказано иное:

idnameagesalary
1Дима23400
2Петя25500
3Вася23500
4Коля301000
5Иван27500
6Кирилл281000

Пример

Давайте выберем все уникальные значения зарплат из таблицы workers:

SQL запрос выберет следующие строки:

salary
400
500
1000

Пример

Давайте подсчитаем все уникальные значения зарплат из таблицы workers (их будет 3 штуки: 400, 500 и 1000):

SQL запрос выберет следующие строки:

Пример

Давайте подсчитаем одновременно все уникальные значения зарплат и уникальные значения возрастов и запишем их в разные поля:

SQL запрос выберет следующие строки:

salary_countage_count
35

Пример

Давайте просуммируем все уникальные значения зарплат из таблицы workers:

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

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

Программным способом может быть:

  • добавьте УНИКАЛЬНЫЙ ИНДЕКС в поле
  • генерировать случайную строку в PHP
  • цикл в PHP (while (! DO_THE_INSERT))
    • сгенерировать другую строку

    Заметка:

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

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

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

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

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

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

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

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

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

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

    Я не знаю источник ваших процедур в PHP, который генерирует уникальные значения. Если это функция библиотеки, они должны гарантировать, что ваше значение действительно уникально. Проверьте документацию. Вы должны, hovwer, использовать эту функцию все время. Если вы, например, используете функцию PHP для генерации уникального значения, а затем вы решаете использовать функцию MySQL, вы можете генерировать значение, которое уже существует. В этом случае установка УНИКАЛЬНОГО ИНДЕКСА в столбце также является хорошей идеей.

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

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

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

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

    это может помочь вам …

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

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

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

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

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

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

    При работе с GUID полями мы получаем достаточно преимуществ и недостатков. В этой главе мы рассмотрим и то и другое, а также примеры обхода недостатков.

    Давайте для иллюстрации примеров с GUID полями создадим две связанные таблицы: типы телефонов и номера телефонов. Подобные таблицы у нас уже существуют в тестовой базе данных, поэтому я взял их копию, заменил тип ключевых полей на uniqueidentifier и добавил к именам таблиц и ограничений префикс _G. Все это в виде SQL сценария можно увидеть в листинге 2.14.

    Листинг 2.14. Создание таблиц, связанных через uniqueidentifier поля

    Обратите внимание, что для первичного ключа в качестве значения по умолчанию указана функция NewID(), которая генерирует уникальный идентификатор. Если пользователь будет добавлять запись и не укажет явное значение, то оно будет сгенерировано.

    Следующие два примера добавляют в таблицу типы телефонов сотовый и домашний:

    Мне повезло. Я наглядно смог увидеть, что домашний тип телефона добавлялся позже, а при отображении он стоит первым, потому что для него сгенерирован меньший идентификатор. Это и есть недостаток, который невозможно контролировать. Единственный удачный выход – добавить в таблицу типов еще одно поле, которое будет иметь автоматически увеличиваемое значение.

    Давайте очистим таблицу (DELETE FROM tbPhoneType_G) и добавим новое поле

    Снова добавьте в таблицу записи типов телефонов. Чтобы просмотреть все строки в порядке добавления в таблицу, необходимо отсортировать вывод по полю "id":

    От одного недостатка избавились. Давайте двигаться дальше. Теперь посмотрим, как можно добавлять записи в таблицу телефонов. В таблице телефонов нам нужно указать идентификатор типа и номер телефона. Проблема возникает именно с первым значением, потому что вводить идентификаторы вручную проблематично. Эта проблема решается следующим образом:

    В этом примере сначала объявляется переменная @TypeID типа uniqueidentifier. Затем в эту переменную с помощью запроса SELECT записывается идентификатор домашнего типа телефона. Теперь у нас есть все необходимо для добавления записи, что происходит в последнем запросе.

    Посмотрим, как можно увидеть записи в связанных таблицах. Тут особой разницы от других типов ключевых полей нет:

    Допустим, что вы четко знаете, что GUID идентификатор типа телефона равен 09F972F4-CFF9-4E96-9B7C-14AA04B835F3. Как его можно использовать напрямую? Чтобы SQL запрос воспринял это число как GUID, его необходимо заключить в фигурные скобки и передать в виде строки.

    Следующий пример объявляет переменную @TypeID типа uniqueidentifier и с помощью SET помещает в эту переменную явное значение, которое потом будет использоваться при добавлении записи с номером телефона:

    Обратите внимание, что значение GUID сначала заключается в фигурные скобки и после этого еще и в одинарные кавычки. Если что-то из этого не указать, сервер вернет ошибку.

    Зная идентификатор, можно добавить строку одной командой INSERT INTO. Например:

    Благодаря использованию GUID идентификаторов, упрощается добавление записей сразу в две таблицы. Например, в следующем запросе в таблицу типов добавляется новая строка "Сотовый личный" и тут же мы добавляем номер телефона с соответствующим типом:

    В этом примере, в переменную @TypeID заносится результат выполнения функции NewID(), т.е. сгенерированное значение. После этого, с этим идентификатором добавляются строки в таблицы типов телефонов и в таблицу номеров телефонов.

    У нас достаточно знаний, чтобы усложнить пример и сделать проверку, существует ли в таблице нужный телефон и добавлять запись только в том случае, если не существует. Если нужный тип уже есть в таблице, то нужно использовать его GUID. Все это реализовано в листинге 2.15.

    Листинг 2.15. Добавление типа только если это нужно

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

    Как видите, проблемы при использовании GUID есть, но они решаемы. А ведь преимущества от использования GUID затмевают все недостатки. Главное преимущество – возможность самостоятельного задания первичного ключа, без риска нарушения целостности. Это преимущество особенно проявляется при разработке клиентского приложения на языках высокого уровня, например, Delphi или C++. На этих языках пользователь может вводить данные на стороне клиента и сохранять их в памяти. Когда данные накопятся, их можно одним блоком сохранить на сервере.

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

    Однако я не смог найти ничего конкретного для решения этой проблемы в Go. Я не могу ничего сделать, чтобы изменить способ хранения SQL-серверов. Я что-то упустил с помощью реализации UUID-сканирования? Я не видел способа изменить способ чтения. Моим последним вариантом будет написать мою собственную реализацию, чтобы поменять местами биты, но хотелось бы узнать, не пропал ли я что-то с драйверами или пакетами UUID или какой-либо другой библиотекой там.

    задан KenWin0x539 02 июля '16 в 16:56

    Auto generated SQL Server keys with the uniqueidentifier or IDENTITY

    Генератор уникальных GUID идентификаторов

    Программа Генератор GUID идентификаторов генерирует уникальный идентификатор GUID. Обратите внимание, что эти GUID идентификаторы глобально уникальны. Нельзя создать два одинаковых идентификатора, даже независимо, на разных компьютерах. Это обеспечивается возможностями платформы Win32. Но для этого правила существует одно условие: на компьютере, где осуществляется создание GUID, должен быть установлен сетевой адаптер. Именно его идентификационный номер, уникальность которого обеспечивается производителем (MAC-адрес), участвует в получении уникального значения GUID. При отсутствии сетевого адаптера значения GUID генерируются случайным образом и потому являются псевдоуникальными (хотя даже в этом случае вероятность независимого создания двух одинаковых идентификаторов GUID исчезающе мала).

    Программа Генератор GUID (GUID Generator) имеет простой интерфейс, не использует никаких сторонних библиотек, только API функции Windows.

    uniqueidentifier (Transact-SQL)

    Программа предназначена для генерирования значения уникального идентификатора GUID (UUID).

    Полученное значение GUID (UUID)можно копировать в буфер обмена для дальнейшего использования в других приложениях либо сохранения в файле.

    Вернуться на страницу "Браузерные программы.Генераторы".

    MS SQL Server позволяет создавать автоинкрементные поля (счетчики); сервер сам будет задавать последовательные значения этого поля в каждой новой строке таблицы (1, 2, 3…).


    Рис. 3.6. Создание автоинкрементного поля

    MS SQL uniqueidentifier с драйвером Golang SQL и UUID

    Признак автоинкрементности обычно устанавливается у несмысловых первичных ключей для автоматического присвоения им уникальных последовательных значений. Автоинкремент может быть задан только для полей с числовыми типами данных.

    Дата публикования: 2014-11-03; Прочитано: 645 | Нарушение авторского права страницы

    Uniqueidentifier .

    uniqueidentifier (Transact-SQL)uniqueidentifier (Transact-SQL)

    16-байтовый идентификатор GUID.Is a 16-byte GUID.

    Столбец или локальную переменную типа uniqueidentifier можно инициализировать следующими способами:A column or local variable of uniqueidentifier data type can be initialized to a value in the following ways:

    • с помощью функции NEWID или NEWSEQUENTIALID;By using the NEWID or NEWSEQUENTIALID functions.
    • путем преобразования из строковой константы в виде xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, где каждому x соответствует шестнадцатеричная цифра (0–9 или A–F).By converting from a string constant in the form xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, in which each x is a hexadecimal digit in the range 0-9 or a-f.Например, 6F9619FF-8B86-D011-B42D-00C04FC964FF является допустимым значением uniqueidentifier.For example, 6F9619FF-8B86-D011-B42D-00C04FC964FF is a valid uniqueidentifier value.

    Значения uniqueidentifier поддерживают операторы сравнения,Comparison operators can be used with uniqueidentifier values.однако их упорядочивание реализовано без использования поразрядного сравнения.However, ordering is not implemented by comparing the bit patterns of the two values.Со значениями uniqueidentifier можно выполнять только операции сравнения (=, <>, , =) и проверки значения NULL (IS NULL и IS NOT NULL).The only operations that can be performed against a uniqueidentifier value are comparisons (=, <>, , =) and checking for NULL (IS NULL and IS NOT NULL).Никакие другие арифметические операторы не поддерживаются.No other arithmetic operators can be used.К типу данных uniqueidentifier можно применять все ограничения и свойства столбцов, за исключением IDENTITY.All column constraints and properties, except IDENTITY, can be used on the uniqueidentifier data type.

    Преобразование данных uniqueidentifierConverting uniqueidentifier Data

    Тип uniqueidentifier считается символьным типом при преобразовании из символьного выражения, поэтому на него распространяются правила усечения при преобразовании в символьный тип.The uniqueidentifier type is considered a character type for the purposes of conversion from a character expression, and therefore is subject to the truncation rules for converting to a character type.Это значит, что при преобразовании символьного выражения в символьный тип данных другой длины значения, слишком длинные для нового типа данных, усекаются.That is, when character expressions are converted to a character data type of a different size, values that are too long for the new data type are truncated.См.

    ограниченияLimitations and restrictions

    Следующие средства и компоненты не поддерживают тип данных :These tools and features do not support the data type:

    ПримерыExamples

    В следующем примере значение преобразуется в тип данных .The following example converts a value to a data type.

    Следующий пример показывает усечение данных, когда значение является слишком длинным для преобразования в заданный тип данных.The following example demonstrates the truncation of data when the value is too long for the data type being converted to.Так как тип данных uniqueidentifier ограничен 36 символами, все символы, выходящие за пределы этой длины, будут усечены.Because the uniqueidentifier type is limited to 36 characters, the characters that exceed that length are truncated.

    Ниже приводится результирующий набор.Here is the result set.

    См. также разделSee also

    ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)
    Функции CAST и CONVERT (Transact-SQL)CAST and CONVERT (Transact-SQL)
    CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL)
    Типы данных (Transact-SQL)Data Types (Transact-SQL)
    DECLARE @local_variable (Transact-SQL)DECLARE @local_variable (Transact-SQL)
    NEWID (Transact-SQL)NEWID (Transact-SQL)
    NEWSEQUENTIALID (Transact-SQL)NEWSEQUENTIALID (Transact-SQL)
    SET @local_variable (Transact-SQL)SET @local_variable (Transact-SQL)
    Updatable Subscriptions for Transactional ReplicationUpdatable Subscriptions for Transactional Replication

    Это зависит от того, как вы отформатируете Guid:

    => 36 символов (дешифрованный)
    выходов:

    => 36 символов (Hyphenated, то же, что )
    выходов:

    => 32 символа (только цифры)
    выходов:

    => 38 символов (фигурные скобки)
    выходы:

    => 38 символов (скобки)
    выходы:

    => 68 символов (шестнадцатеричный)
    выходы:

    Правильная вещь здесь — хранить ее как — это тогда полностью индексируемо и т. Д. В базе данных. Следующим лучшим вариантом будет столбец: стандартные GUID имеют ровно 16 байт.

    Если вы должны сохранить его как строку, длина действительно сводится к тому, как вы ее кодируете. В качестве шестнадцатеричного кода (кодирование с базой-16 AKA) без дефиса это будет 32 символа (две шестнадцатеричные цифры на каждый байт), поэтому .

    GUID — 128 бит, или

    Так что да, не менее 20 символов, что на самом деле тратит больше 4,25 бит, поэтому вы можете быть таким же эффективным, используя меньшие базы, чем 95; основание 85 является наименьшим возможным, которое все еще вписывается в 20 символов:

    Двоичные строки хранят необработанные данные, а символьные строки хранят текст. Используйте двоичные данные при хранении шестнадцатеричных значений, таких как , и т.

    Д. Тип данных uniqueidentifier содержит глобально уникальный идентификатор или GUID. Это значение выводится с помощью функции NEWID (), чтобы вернуть значение, уникальное для всех объектов. Он сохраняется как двоичное значение, но отображается как строка символов.

    Применимо к: SQL Server В следующем примере создается таблица cust с типом данных uniqueidentifier и используется NEWID для заполнения таблицы значением по умолчанию. При присвоении значения NEWID () по умолчанию каждая новая и существующая строка имеет уникальное значение для столбца CustomerID.

    Читайте также: