无法设置唯一键以避免插入重复的行?

Can't set unique key to avoid inserting duplicated rows?

我想避免插入重复的行,因此为所有这些字段设置 UNIQUE KEY:

CREATE TABLE `tag` (
    `id` int(8) NOT NULL AUTO_INCREMENT,
    `tag` varchar(256) DEFAULT NULL,
    `version` varchar(20) DEFAULT NULL,
    `custom` tinyint(1) DEFAULT NULL,
    `abstract` tinyint(1) DEFAULT NULL,
    `datatype` varchar(20) DEFAULT NULL,
    `iord` char(1) DEFAULT NULL,
    `crdr` char(1) DEFAULT NULL,
    `tlabel` varchar(512) DEFAULT NULL,
    PRIMARY KEY(`id`),
    UNIQUE KEY(`tag`,`version`,`custom`,`abstract`,`datatype`,`iord`,`crdr`,`tlabel`)
);

遇到错误:

ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes

有两个问题让我很困惑: 问题 1:

 8+256+20+1+1+20+1+1+512 = 820 < 3072

所有字段的总长度小于 3072。

第 2 期:

UNIQUE KEY(`tag`,`version`,`custom`,`abstract`,`datatype`,`iord`,`crdr`,`tlabel`)

不行,那怎么避免插入重复的行呢?

this GitHub bug post 看来,您的默认数据库字符集可能是 UTF-8,每个字符需要(最多)4 个字节,因此实际上会超过 3027 的限制,该限制出现在您的当前的错误信息。一种选择是使用字符集创建 table,其中一个字符只是一个字节:

CREATE TABLE tag (
    id int(8) NOT NULL AUTO_INCREMENT,
    tag varchar(256) DEFAULT NULL,
    version varchar(20) DEFAULT NULL,
    custom tinyint(1) DEFAULT NULL,
    abstract tinyint(1) DEFAULT NULL,
    datatype varchar(20) DEFAULT NULL,
    iord char(1) DEFAULT NULL,
    crdr char(1) DEFAULT NULL,
    tlabel varchar(512) DEFAULT NULL,
    PRIMARY KEY(id),
    UNIQUE KEY(tag, version, custom, abstract, datatype, iord, crdr, tlabel)
) DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;

这是 MySQL 使用的默认字符集和排序规则。它应该是 suitable 如果你只打算存储拉丁兼容文本(而不是像中文这样需要 UTF-8 支持的东西)。