2

这是一个非常直接的问题,但我还没有找到任何解决方案。场景是我的数据库中有 2 个表。第二个表的来源取决于第一个表的 SOURCE_URL(可以超过 255 个字符,所以我使用了 TEXT)。

create table SOURCES (
        SOURCES_PK int not null AUTO_INCREMENT primary key,
        SOURCE_URL text not null unique,
        DESCRIPTION varchar(255)
);

create table ASSERTIONGROUP (
        ASSERTION_PK int AUTO_INCREMENT primary key,
        LABEL varchar(255),
        SOURCE text not null,
        foreign key (SOURCE) references SOURCES(SOURCE_URL)
);

我收到这个错误-

密钥规范中使用的 BLOB/TEXT 列“SOURCE”没有密钥长度

我在这篇文章中看到了讨论——MySQL 错误:没有密钥长度的密钥规范
但想不出任何解决办法。
我可以从第一个表中删除唯一的,但我不能分配外键约束。

我知道该TEXT领域不可能是唯一的,因此寻找替代方法。

4

2 回答 2

3

为了匹配长 varchar 或 blob 列,您需要指定索引长度:

create table SOURCES (
  SOURCES_PK int not null AUTO_INCREMENT primary key,                    
  SOURCE_URL text not null unique,                    
  DESCRIPTION varchar(255),
  INDEX source_url (source_url(100)) );
//  Key length ----------------^^^ 

对于 MyISAM

最大密钥长度为 1000 字节。这也可以通过更改源并重新编译来更改。对于长度超过 250 字节的密钥,使用比默认值 1024 字节更大的密钥块大小。

对于 InnODB

索引键前缀最长可达 767 个字节。请参见第 12.1.8 节,“CREATE INDEX 语法”。

见:http ://dev.mysql.com/doc/refman/5.5/en/create-table.html

于 2011-06-16T15:54:08.897 回答
2

不幸的是,您不能索引整个 BLOB 和 TEXT,因为索引键的长度有限。

您只能在 myasam 引擎上创建全文索引。

当我需要实现唯一性约束时,我通常使用包含文本哈希(SHA 或 MD5)的特定列,以及一些处理哈希冲突的代码。

它有点难看,但它有效

于 2011-06-16T15:25:27.707 回答