在MySQL中强制使用唯一的行

时间:2008-09-18 04:42:33

标签: mysql indexing mysql-error-1071

我在MySQL中有一个包含3个字段的表,我希望在两个字段中强制执行唯一性。这是表DDL

CREATE TABLE `CLIENT_NAMES` (
`ID` int(11) NOT NULL auto_increment,
`CLIENT_NAME` varchar(500) NOT NULL,
`OWNER_ID` int(11) NOT NULL,
PRIMARY KEY  (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ID字段是代理键(此表正在加载ETL)。 CLIENT_NAME是包含客户端名称的字段 OWNER_ID是一个ID,表示客户所有者。

我认为我可以使用CLIENT_NAMEOWNER_ID上的唯一索引强制执行此操作,

ALTER TABLE `DW`.`CLIENT_NAMES` 
ADD UNIQUE INDEX enforce_unique_idx(`CLIENT_NAME`, `OWNER_ID`);

但是MySQL给了我一个错误:

  

执行SQL命令以更新表时出错。   指定密钥太长;最大密钥长度为765字节(错误1071)

其他人有什么想法吗?

4 个答案:

答案 0 :(得分:9)

MySQL不能对长度超过765字节的密钥强制执行唯一性(显然500 UTF8字符可以超过此限制)。

  1. CLIENT_NAME真的需要500个字符吗?似乎有点过分。
  2. 添加一个新的(更短的)哈希列(CLIENT_NAME)。让MySQL在该哈希上强制实现唯一性。

答案 1 :(得分:0)

你看过CONSTRAINT ...... UNIQUE?

答案 2 :(得分:0)

这张桌子似乎有些奇怪;我实际上会考虑重构它。 ID和OWNER_ID引用什么,它们之间有什么关系?

有没有意义

CREATE TABLE `CLIENTS` (
`ID` int(11) NOT NULL auto_increment,
`CLIENT_NAME` varchar(500) NOT NULL,
# other client fields - address, phone, whatever
PRIMARY KEY  (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `CLIENTS_OWNERS` (
`CLIENT_ID` int(11) NOT NULL,
`OWNER_ID` int(11) NOT NULL,
PRIMARY KEY  (`CLIENT_ID`,`OWNER_ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我真的会避免在500个字符的字符串上添加这样的唯一键。在两个整数上强制执行唯一性更有效,而表中的id应该真正引用需要id的东西;在您的版本中,ID字段似乎只标识客户端/所有者关系,它实际上不需要单独的ID,因为它只是一个映射。

答案 3 :(得分:-1)

Here。对于UTF8字符集,MySQL每个字符最多可使用3个字节。 CLIENT_NAME是3 x 500 = 1500字节。将CLIENT_NAME缩短为250。

以后: +1来创建名称的哈希并将其用作密钥。