2

我有一个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_NAME我以为我可以在and上使用唯一索引来强制执行此操作OWNER_ID

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

但 MySQL 给了我一个错误:

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

其他人有什么想法吗?

4

4 回答 4

9

MySQL 不能对长度超过 765 字节的键强制唯一性(显然 500 个 UTF8 字符可以超过这个限制)。

  1. CLIENT_NAME 真的需要 500 个字符吗?好像有点过分了。
  2. 添加一个新的(较短的)列,即 hash(CLIENT_NAME)。让 MySQL 改为在该哈希上强制执行唯一性。
于 2008-09-18T04:46:34.620 回答
0

你看过 CONSTRAINT ... UNIQUE 吗?

于 2008-09-18T04:45:47.977 回答
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,因为它只是一个映射。

于 2008-09-18T05:08:01.840 回答
-1

在这里。对于 UTF8 字符集,MySQL 每个字符最多可以使用 3 个字节。CLIENT_NAME 为 3 x 500 = 1500 字节。缩短CLIENT_NAME到 250。

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

于 2008-09-18T04:49:44.317 回答