我有一个表,它只包含有关文件的信息,因此,由于文件路径是唯一的并且可以识别任何条目,我认为我应该将它用作主键。
虽然,我遇到了一些问题,比如需要指定密钥长度(错误 1170)。我该怎么办?使用整数作为主键,每次我需要访问文件“x”的信息时,执行“where FilePath=x”?
感谢您花时间阅读我的问题。
我有一个表,它只包含有关文件的信息,因此,由于文件路径是唯一的并且可以识别任何条目,我认为我应该将它用作主键。
虽然,我遇到了一些问题,比如需要指定密钥长度(错误 1170)。我该怎么办?使用整数作为主键,每次我需要访问文件“x”的信息时,执行“where FilePath=x”?
感谢您花时间阅读我的问题。
在大多数数据库中,为足够长以存储深度文件路径的字符串列创建索引是低效的(甚至是不可能的)。这是使用代理键的好情况。
另一种选择是使用廉价的散列函数从文件路径计算固定长度的散列,例如MD5()
(尽管 MD5 的强度不足以用于密码,但在这种情况下,它足以确保输入数据的唯一性)。
使用 int 作为主键并将 Unique 放在文件路径的字段中。
CREATE TABLE `cms`.`test` (
`id` INT( 32 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`filepath` VARCHAR( 255 ) NOT NULL ,
UNIQUE (
`filepath`
)
) ENGINE = MYISAM
您可以为文件路径指定最大长度并将列更改为 varchar 吗?
这篇文章解释了这个错误。基本上,您不能将键放在文本或 blob 列上,因为键需要一个长度来检查唯一性。但是 text 和 blob 列不支持长度。所以你不能在一个键中使用它们。
在更高版本的 MySQL 中,Varchar 列最多可以包含 65K 个字符
VARCHAR 列中的值是可变长度字符串。在 MySQL 5.0.3 之前,长度可以指定为 0 到 255 之间的值,在 5.0.3 和更高版本中可以指定为 0 到 65,535 之间的值。MySQL 5.0.3 及更高版本中 VARCHAR 的有效最大长度取决于最大行大小(65,535 字节,在所有列之间共享)和使用的字符集。
不要使用自然键(文件路径/名称)使用代理键(int)
我会将主键设为 INT,并将任何路径和文件放入不同的列中。将长字符串作为键和/或作为其他表中的外键会很慢。
您可能希望从路径中拆分文件名,和/或仅存储路径的一部分。路径的主根可以是附加到数据库部分路径+文件名的配置设置。
当我们存储文件信息时,我们只存储名称,路径是基于其他数据构建的:相关项目(订单、事件、工作等),然后是其他数据的 ID,等等......