Clé unique = Clé primaire (ou secondaire) = Index unique, clustered si aucun index clustered déjà présent.
Sous Oracle par exemple, on crée très rarement de clé primaire sur une table, on se contente de faire un index unique dessus.
Ce dernier va garantir l'unicité des données sans nécessiter un trigger (la requête plantera en cas de doublon, et ce, sans devoir vérifier les données au préalable, juste l'index, donc bien plus rapide)
Si tu veux associer un ID unique à ce champ, alors deux solutions :
- Créer une séquence (Oracle, PostGre, etc.) plus un trigger, qui s'occupe UNIQUEMENT de mettre la nouvelle valeur de la séquence à la place de l'ID quand il n'est pas renseigné.
- Créer un champ de type "numéro auto" (MySQL, Access) ou de type Identity avec un incrément de 1 (SQL Server 2000)
- Créer un champ de type "uniqueID" avec comme valeur par défaut "=newUniqueID()" (SQL Server 2000)
A noter que la dernière solution est pas mal pour gérer par exemple des comptes utilisateurs, ou toute autre donnée sensible dont tu veux empêcher la déduction de l'ID.
Unique ID est une série de chiffres sur 72 bits, générés aléatoirement. Après un rapide calcul, on s'apperçoit qu'un processeur cadencé à 3 GHz, à compter qu'il est capable de générer un tel chiffre en un seul cycle (ce qui est faux) et qui passe sont temps à ne faire que ça, va mettre quelques millions d'années pour avoir une chance sur 1000 de générer un doublon. Donc ce type de données, donc l'unicité n'est pas garantie, et tout de même réputé unique. L'avantage, c'est que t'as pas de séquence 1, 2, 3, 4, qu'un hacker peut aisément tenter d'exploiter pour se faire passer par un autre utilisateur par exemple. Là, il a lui aussi une chance sur nbLignes / 2*^72 de trouver un ID déjà existant par hasard, donc ne peut utiliser ce genre de failles.
En contre-partie, 72 bits c'est plus lourd à gérer par le moteur de la base de données qu'un 32 bits (integer)