Можно ли использовать GUID как первичные ключи в базе данных SQLITE? Если возможно, какой тип данных можно использовать?
Можем ли мы использовать Guid в качестве основного ключа в базе данных Sqlite
Ответ 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)))
С аналогичной производительностью индекса значительным компромиссом становится использование удобочитаемой строки для меньшего размера двоичных данных.