2009-03-26 5 views
2

J'ai une table qui ne contiendra que des informations sur les fichiers, donc, comme le chemin du fichier est unique et peut identifier n'importe quelle entrée, j'ai pensé que je devrais l'utiliser comme clé primaire.Utiliser un chemin de fichier comme clé primaire dans MySQL

Bien que, j'ai quelques problèmes comme avoir besoin de spécifier une longueur de clé (erreur 1170). Que devrais-je faire? Utilisez un entier comme clé primaire et chaque fois que j'ai besoin d'accéder aux informations sur le fichier 'x', faites un "where FilePath = x"?

Merci pour le temps dispensé de lire ma question.

Répondre

4

Dans la plupart des bases de données, il est inefficace (voire impossible) de créer un index pour une colonne de chaîne suffisamment longue pour stocker un chemin de fichier profond. C'est une bonne situation pour utiliser une clé de substitution. Une autre option consisterait à calculer un hachage de longueur fixe à partir du chemin du fichier en utilisant une fonction de hachage peu coûteuse telle que MD5() (bien que MD5 ne soit pas assez puissant pour les mots de passe, il est assez fort pour assurer l'unicité ce cas).

3

Utilisez un int comme clé primaire et placez Unique dans le champ correspondant au chemin du fichier.

CREATE TABLE `cms`.`test` (
    `id` INT(32) NOT NULL AUTO_INCREMENT PRIMARY KEY , 
    `filepath` VARCHAR(255) NOT NULL , 
UNIQUE (
    `filepath` 
) 
) ENGINE = MYISAM 
+0

Il crie la même erreur (1170) que s'il s'agissait de la clé primaire. Mais merci pour l'essai :) –

+0

Désolé, en fait votre code fonctionne. C'est moi qui essayais d'utiliser TEXT au lieu de VARCHAR (255). Mais je pense que VARCHAR (255) est trop court pour les chemins de fichier, n'est-ce pas? –

+0

Allez ici, http: // lipsum.com/et mettre 255 octets dans le champ, le texte affiché est cette longueur. –

1

Pouvez-vous spécifier un maxlength pour une filepath et changer la colonne à un varchar?

This article explains the error. Fondamentalement, vous ne pouvez pas mettre une clé sur une colonne text ou blob car une clé a besoin d'une longueur pour vérifier l'unicité. Mais les colonnes text et blob ne supportent pas les longueurs. Vous ne pouvez donc pas les utiliser dans une clé.

colonnes VARCHAR peuvent aller jusqu'à 65K caractères dans les versions ultérieures de MySQL

Les valeurs dans les colonnes VARCHAR sont de longueur variable. La longueur peut être spécifiée comme une valeur comprise entre 0 et 255 avant MySQL 5.0.3 et entre 0 et 65 535 dans les versions 5.0.3 et ultérieures. La longueur maximale effective d'un VARCHAR dans MySQL 5.0.3 et ultérieur dépend de la taille maximale de la ligne (65 535 octets, qui est partagée entre toutes les colonnes) et du jeu de caractères utilisé.

+0

Cela ferait l'affaire mais dans mon esprit, 255 caractères sont des chemins de fichiers de fichiers trop courts. Je voudrais être capable de longs noms de fichiers. Y a-t-il un moyen? –

+0

Maintenant que j'ai essayé d'utiliser varchar (65535), il est dit que la longueur de la clé est limitée à 1000 et j'utilise la version 5.1.31. –

1

Ne pas utiliser

une clé naturelle (chemin de fichier/nom) utiliser une clé de substitution (int) Je la clé primaire INT, et mettre n'importe quel chemin & dans une colonne différente. Il serait lent d'avoir une longue chaîne comme clé, et/ou comme une clé étrangère dans d'autres tables.

Vous pouvez séparer le nom de fichier du chemin d'accès et/ou stocker uniquement une partie du chemin. La racine principale du chemin peut être un paramètre de configuration que vous ajoutez au chemin partiel de la base de données + nom du fichier. Lorsque nous stockons des informations sur les fichiers, nous stockons simplement le nom, le chemin est construit sur la base d'autres données: élément lié (ordre, incident, travail, etc), puis l'ID de ces autres données, etc ...

Questions connexes