我在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
和OWNER_ID
上的唯一索引强制执行此操作,
ALTER TABLE `DW`.`CLIENT_NAMES`
ADD UNIQUE INDEX enforce_unique_idx(`CLIENT_NAME`, `OWNER_ID`);
但是MySQL给了我一个错误:
执行SQL命令以更新表时出错。 指定密钥太长;最大密钥长度为765字节(错误1071)
其他人有什么想法吗?
答案 0 :(得分:9)
MySQL不能对长度超过765字节的密钥强制执行唯一性(显然500 UTF8字符可以超过此限制)。
答案 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来创建名称的哈希并将其用作密钥。