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

Есть ли тип данных UID в SQLITE, если да, то как создать значение для этого

Я создаю таблицу следующим образом:

CREATE TABLE foobar (id uniqueidentifier, foo text, bar text, PRIMARY  KEY (id))

Как вставить или сгенерировать значение для поля id в таблице foobar?

4b9b3361

Ответ 1

Можно утверждать, что SQLite не поддерживает типы данных вообще. В SQLite3 вы можете сделать это, например.

sqlite> create table test (id wibblewibble primary key);

SQLite с радостью создаст столбец с "типом данных" wibblewibble. SQLite также будет радостно создавать столбцы с "типами данных" uuid, guid и SuperChicken.

Важным моментом для вас является, вероятно, автоматическое создание uid. SQLite не может вам помочь.

Вы можете оставить его полностью до клиентской программы. Если вы программируете на python, используйте uuid module. В рубине у вас есть функция SecureRandom.uuid. Другие языки имеют схожие функции или обходные пути.

Вы можете написать свою собственную функцию генерации uid в C. (См. Создать или переопределить SQL-функции.) Я бы назвал это относительно экстремальный подход.

Вы можете сохранить его в формате binary или .


Другие разговоры онлайн показывают, что существует широко распространенное недоразумение относительно того, что такое UUID. UUID - это не просто 128-битное случайное число. UUID имеет структуру и правила. См. RFC 4122.

Ответ 2

Ответ Бенджамина Берри не прав. он создает неверные UUIDs; но он показывает интересную технику, используя подзаголовок для генерации случайности, а затем выбирает подстроки из этого. Здесь что-то подобное, что я подтвердил, работает:

select substr(u,1,8)||'-'||substr(u,9,4)||'-4'||substr(u,13,3)||
  '-'||v||substr(u,17,3)||'-'||substr(u,21,12) from (
    select lower(hex(randomblob(16))) as u, substr('89ab',abs(random()) % 4 + 1, 1) as v);

Некоторые выходные данные:

c71122df-18e4-4a78-a446-fbf7b8f2969b
61e75f87-978b-4d9e-b587-bedcc2d23898
30eee0fa-2ff2-4ff5-b8ef-f99378272999

Ответ 3

Вот что-то подобное, которое может быть использовано непосредственно как выражение:

lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6)))

например, для передачи в качестве значения по умолчанию для столбца:

sqlite> create table "table" (
  "id" char(36) default (lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6)))), 
  "data" varchar(255), primary key ("id")
);

sqlite> insert into "table" ("data") values ('foo');
sqlite> insert into "table" ("data") values ('bar');
sqlite> select * from "table";
947efcc9-4212-442a-b68c-eb6fbd8a7128|foo
a2c3857b-1eb4-40bd-aed2-6e8d68cc2ab8|bar

Ответ 4

понадобилось это для проекта

select SUBSTR(UUID, 0, 8)||'-'||SUBSTR(UUID,8,4)||'-'||SUBSTR(UUID,12,4)||'-'||SUBSTR(UUID,16)
from (
select lower(hex(randomblob(16))) AS UUID 
);