web-dev-qa-db-fra.com

Comment dois-je stocker un GUID dans Oracle?

Je viens du monde du serveur SQL où nous avions un identifiant unique. Y a-t-il un équivalent dans Oracle? Cette colonne sera fréquemment interrogée, donc la performance est la clé.

Je génère le GUID dans .Net et je le transmettrai à Oracle. Pour plusieurs raisons, il ne peut pas être généré par Oracle, donc je ne peux pas utiliser la séquence.

45
Shaun Bowe
CREATE table test (testguid RAW(16) default SYS_GUID() ) 

Ce blog a étudié les performances relatives.

48
Turnkey

Comme d'autres l'ont déclaré, il y a un impact sur les performances à l'aide des GUID par rapport aux séquences numériques. Cela dit, il existe une fonction nommée " SYS_GUID () " disponible depuis Oracle 8i qui fournit l'équivalent brut:

SQL> SELECT SYS_GUID() FROM DUAL;

SYS_GUID()
--------------------------------
248AACE7F7DE424E8B9E1F31A9F101D5

Une fonction pourrait être créée pour renvoyer un GUID formaté:

CREATE OR REPLACE FUNCTION GET_FORMATTED_GUID RETURN VARCHAR2 IS guid VARCHAR2(38) ;
BEGIN
    SELECT SYS_GUID() INTO guid FROM DUAL ;

    guid :=
        '{' || SUBSTR(guid,  1, 8) ||
        '-' || SUBSTR(guid,  9, 4) ||
        '-' || SUBSTR(guid, 13, 4) ||
        '-' || SUBSTR(guid, 17, 4) ||
        '-' || SUBSTR(guid, 21) || '}' ;

    RETURN guid ;
END GET_FORMATTED_GUID ;
/

Renvoyant ainsi une chaîne interchangeable:

SQL> SELECT GET_FORMATTED_GUID() FROM DUAL ;

GET_FORMATTED_GUID()
--------------------------------------
{15417950-9197-4ADD-BD49-BA043F262180}

Il convient de noter que certaines plates-formes Oracle renvoient des valeurs similaires mais toujours uniques de GUID comme indiqué par Steven Feuerstein.

6
Erik Anderson

Si je comprends bien la question, vous souhaitez générer un identifiant unique lorsque vous insérez une ligne dans la base de données.
Vous pouvez utiliser une séquence pour ce faire. lien ici
Une fois que vous avez créé votre séquence, vous pouvez l'utiliser comme ceci:

INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data');
4
hamishmcn

RAW (16) est apparemment l'équivalent préféré pour le type MS SQL uniqueidentifier.

3
stolsvik

Les GUID ne sont pas aussi utilisés dans Oracle que dans MSSQL, nous avons tendance à avoir un champ NUMBER (non null & primary key), une séquence et un déclencheur lors de l'insertion pour le remplir (pour chaque table).

1
Osama Al-Maadeed

Il n'y a pas d'identifiant unique dans Oracle.

Vous pouvez en implémenter un vous-même en utilisant RAW (une sorte de douleur) ou CHAR. Les performances des requêtes qui se joignent à un champ CHAR souffriront (peut-être jusqu'à 40%) par rapport à l'utilisation d'un entier.

Si vous faites des bases de données distribuées/répliquées, le résultat de performance en vaut la peine. Sinon, utilisez simplement un entier.

0
MusiGenesis

La pratique générale utilisant Oracle consiste à créer une clé artificielle. Il s'agit d'une colonne définie comme un nombre. Il est rempli via une séquence. Il est indexé/contraint via une définition de clé primaire.

0
dacracot