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

Можем ли мы использовать Guid в качестве основного ключа в базе данных Sqlite

Можно ли использовать GUID как первичные ключи в базе данных SQLITE? Если возможно, какой тип данных можно использовать?

4b9b3361

Ответ 1

Сам SQLite не поддерживает GUID как внутренний тип.

Кроме того, это так! (вроде). Помните, что в SQLite любая строка может использоваться как имя типа и включает GUID или UUID (подробнее о SQLite datatypes).

В соответствии с этими правилами тип GUID имеет сродство NONE, что совпадает с полями BLOB. Имея это в виду, вы можете создать столбец типа GUID и использовать следующие правила для доступа к нему:

  • Сохраните его как строку, например X'01020304050607080910111213141516' (нотация X используется для представления 16-байтового значения BLOB). Чтобы вставить, используйте:

    INSERT INTO mytable (uuid)
    VALUES (X'01020304050607080910111213141516');
    
  • Прочитайте его как 16-байтовый BLOB. quote(uuid) может использоваться для форматирования вывода с использованием обозначения X:

    SELECT quote(uuid)
    FROM mytable
    

Такой столбец можно также использовать как первичный ключ. К сожалению, нет функциональности AUTOINCREMENT, такой как она существует для целых первичных ключей - вам придется обрабатывать ее самостоятельно. Вы можете использовать что-то простое, как randomblob(16) для этого, но это не совсем UUID, как определено стандартным.

Смутно, вы также можете сохранить текстовое представление UUID в том же поле (SQLite не остановит вас от этого), но для этого потребуется не менее 2x места: BLOB - 16 байт, UUID, поскольку текст по крайней мере 32 байта.

Ответ 2

sqlite3 не имеет собственного 128-битного формата UUID, как такового.

Однако GUID могут использоваться как ключи в SQLite как либо TEXT, так и двоичное представление BLOB.

На основании номеров производительности, отправленных в ответ на аналогичный вопрос, как двоичные, так и строковые UUID могут быть эффективными в SQLite для создания и запроса при индексировании.

см. таблицу в: fooobar.com/info/147691/...

SQLite может генерировать либо BLOB, либо TEXT UUID с randomblob(16) и hex(X) Например: lower(hex(randomblob(16)))

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