有一个产品图片表(PROD_IMAGE)
create table PROD_IMAGE(
PROD_ID not null,
FILENAME TEXT,
foreign key(PROD_ID) references PRODS(ID),
primary key(PROD_ID,FILENAME)
) default charset=utf8;
它包含一个存储路径信息的列(Column)FILENAME,由于路径信息已经
超出了VARCHAR的长度限制,所以我定义列FILENAME的类型为TEXT。
但问题是如果我把TEXT设成主健(primary key)的组成部分(primary key(PROD_ID,FILENAME))那么执行上面的创建语句,会提示错误BLOB/TEXT column 'FILENAME' used in key specification without a key length经过我一翻google,我发现了一个一模一样的问题。http://bytes.com/topic/mysql/answers/141591-trying-make-text-column-primary-keygoogle完后,我理解了上面错误的根源。就是说:“BLOB/TEXT”列‘FILENAME’作为主健组成部分,它应该遵守键规范(key specification),
而指定键的长度是键规范的一部分。
由于为主健创建索引是需要指定主健列(或主健组件列)的索引前缀长度的,如对FILENAME列的前1000个字符进行索引,而1000后面的就不索引处理了。但这样是不实际的,因为有存在路径信息的某长度内的前缀是一样的,但它们的确是不相同的路径。
如(假定键的索引前缀长度为35):
图片1:/images/pc/mainboard/gigabyte/g41000.jpg,索引处理的前缀为:/images/pc/mainboard/gigabyte/g4100
图片2:/images/pc/mainboard/gigabyte/g41001.jpg,索引处理的前缀为:/images/pc/mainboard/gigabyte/g4100
有这么一个解 ———— 使用MD5及SHA函数来为每一个路径信息(或路径信息+产品ID)来生成一个从概率上来说基本上是唯一的字符串,把这个字符串做为主健的组成部分(或主健)各位大虾,小弟求一个实际应用当中解决此问题非常好的一个实现。每一个产品的某一个图片是不允许重复。