primary not for create column check sqlite uid

not - sqlite syntax



¿Hay un tipo de datos UID en SQLITE si Sí, entonces cómo generar valor para eso? (4)

Estoy creando mesa como esta:

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

¿Cómo insertar o generar valor para el campo id en la tabla foobar?


Aquí hay algo similar que se puede usar directamente como una expresión:

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)))

por ejemplo, se pasa como valor predeterminado para la columna:

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


La respuesta de Benjamin Berry no es correcta: produce UUID con formato incorrecto, pero muestra una técnica interesante que utiliza una subselección para generar aleatoriedad y luego seleccionar subcadenas a partir de eso. Aquí hay algo similar que he confirmado que funciona:

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

Algunos resultados de muestra:

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


Puede argumentar que SQLite no admite tipos de datos en absoluto. En SQLite3, puedes hacer esto, por ejemplo.

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

SQLite felizmente creará una columna con el "tipo de datos" wibblewibble. SQLite también felizmente creará columnas con los "tipos de datos" uuid, guid y SuperChicken.

El punto crucial para usted es, probablemente, cómo generar automáticamente un uid. SQLite no puede ayudarte mucho allí.

Puede dejarlo totalmente en manos del programa cliente. Si estás programando en python, usa el módulo uuid . En ruby, tienes la función SecureRandom.uuid . Otros idiomas tienen características similares o soluciones alternativas.

Puede escribir su propia función de generación de uid en C. (Consulte Crear o Redefinir funciones de SQL ). Llamaría a esto un enfoque relativamente extremo.

Puede almacenarlo en formato binary o de text .

Otras conversaciones en línea sugieren que hay un malentendido generalizado sobre qué es un UUID. Un UUID no es simplemente un número aleatorio de 128 bits. Un UUID tiene estructura y reglas. Ver RFC 4122 .


necesitado esto para un proyecto

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