我的数据列超出了MySQL的索引长度限制。因此,我无法使用唯一的密钥。
在没有使用唯一密钥的情况下解决问题的方法是: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
,因此关联的解决方案无效。
还有其他可能的解决方案吗?
答案 0 :(得分:1)
如果您以某种方式标记了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将自动为其赋值。