MySQL:在不使用唯一键的情况下强制使用唯一列

时间:2017-01-23 07:30:06

标签: mysql

我的数据列超出了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的密钥大小限制。 likestweets通常为0,因此关联的解决方案无效。

还有其他可能的解决方案吗?

1 个答案:

答案 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将自动为其赋值。