我有一列数据超出了 MySQL 的索引长度限制。因此,我无法使用唯一的 key 。
这里有一个无需使用唯一 key 即可解决该问题的解决方案:MySQL: Insert record if not exists in table
但是,在评论中,人们在将相同的值插入多个列时遇到了问题。就我而言,我的很多值都是 0
,因此我经常会得到重复的值。
我正在使用 Node 和 node-mysql
来访问数据库。我想我可以有一个变量来跟踪当前插入的所有值。在插入之前,我检查当前是否正在插入该值。如果是这样,我将等到它完成插入,然后继续执行,就像该值最初插入一样。但是,我觉得这很容易出错。
这是我的表架构的一部分:
CREATE TABLE `links` (
`id` int(10) UNSIGNED NOT NULL,
`url` varchar(2083) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
`likes` int(10) UNSIGNED NOT NULL,
`tweets` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
ALTER TABLE `links`
ADD PRIMARY KEY (`id`),
ADD KEY `url` (`url`(50));
我无法在 url
上放置唯一键,因为它可以是 2083 字节,这超出了 MySQL 的键大小限制。 likes
和 tweets
通常为 0
,因此链接的解决方案将不起作用。
还有其他可能的解决方案吗?
最佳答案
如果您以某种方式表达 INSERT
,则可以在完成插入之前使用 WHERE NOT EXISTS
首先检查 URL 是否不存在:
INSERT INTO links (`url`, `likes`, `tweets`)
SELECT 'http://www.google.com', 10, 15 FROM DUAL
WHERE NOT EXISTS
(SELECT 1 FROM links WHERE url='http://www.google.com');
这里假设id
列是主键/自动增量,MySQL会自动为其分配一个值。
关于MySQL:强制使用唯一列而不使用唯一键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41801187/