微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

主键不能包含超过 767 或 1000 个字符作为主键

如何解决主键不能包含超过 767 或 1000 个字符作为主键

我正在尝试创建一个表格,其中一列将包含超过 5000 个字符的字符,并且我不希望此列的任何行重复,因此我使用主键来创建此列中的每一行已经存在时不再保存

但问题是当我尝试使用 column_name VARCHAR(5500) Primary key 创建此列时,它给了我这个错误 Specified key was too long; max key length is 767 bytes

搜索了很多,发现 InnoDB 引擎只接受 767 个字符作为最大长度,而在 MYISAM 引擎中接受 1000 个字符,但这对我没有帮助,因为该列可能包含超过 5000 个字符

我正在寻找的是一种创建列的方法,该列的任何行都不能重复并接受多个字符

CREATE TABLE data_table (
    date_time VARCHAR(100),message VARCHAR(5500) PRIMARY KEY
) ENGINE = MYISAM CHaraCTER SET latin1

解决方法

您遇到了一个基本限制。可悲的是,再多的谈判或黑客攻击也无法让您找到一种只要您需要就可以制作索引的方法。因此,唯一索引并不能解决您防止重复文本字符串的问题。

许多人将 hash of long text fields 与文本一起存储。

SHA-256 is a decent choice for a hash。散列的问题是散列冲突的可能性。也就是说,两个不同的文本字符串可能会生成完全相同的散列。使用 SHA-256 或更大的哈希值,that chance is very low indeed

如果您使用 SHA-256,则需要这样定义的列。 (当然,32 字节与 256 位相同。)

'BatchDataset'

然后当你去插入文本时你可以这样做。

text_hash BINARY(32)

如果您将 INSERT INTO tbl (text,text_hash) VALUES(?,UNHEX(SHA2(?,256)); 设置为唯一索引,您将有一种在尝试时抛出错误来防止重复的方法。像这样的东西。

text_hash
,

需要:“[one] 列将包含字符(超过 5000 个字符),我不希望此列的任何行重复”

PRIMARY KEY 在指定的字段上添加 UNIQUE CONSTRAINT,但如果您不需要将其用作 PRIMARY KEY,请仅使用 UNIQUE。此外,我推荐对大文本列使用 UNIQUE CONSTRAINT。

我建议您通过制作和存储文本的哈希来检查数据的唯一性。

,

当然,哈希是一种方式。 (我认为最新的 MariaDB 有一种神奇的技术!)这是另一种方法:

出于多种原因,您应该从 MyISAM 切换到 InnoDB,但我将在本问答中忽略这一点。

CREATE TABLE data_table (
    date_time VARCHAR(100),message VARCHAR(5500) PRIMARY KEY
    INDEX(message(100))
) CHARACTER SET utf8mb4   -- since you might get non-English test,including Emoji.

(“100”是速度和空间之间的权衡。)

但是你必须做一个额外的测试:

SELECT 1 FROM data_table WHERE message = ?

如果你得到了一些东西,你就有了一个重复——采取行动。否则执行 INSERT。

糟糕,我确实需要坚持使用 InnoDB —— 至少在插入相同消息时可能有冲突的连接:

BEGIN;
SELECT 1 FROM data_table WHERE message = ? FOR UPDATE;
if ... then handle dup and don't COMMIT
INSERT INT data_table (date_time,message) VALUES (?,?);
COMMIT;

您可能希望将所有这些隐藏在存储过程中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。