MySQL:强制使用唯一列而不使用唯一键

标签 mysql

我有一列数据超出了 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 的键大小限制。 likestweets 通常为 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/

相关文章:

mysql - 将查询输出到 csv、codeigniter

php - 缓存大型 SQL 查询 - 构建的最佳方式?

mysql - 查询多个表

c# - MySQL 存储过程和 C# 数据读取器列错误值

mysql - sql 选择移动范围

mysql - 在 MySQL 中的 SELECT 查询中连接 3 个表

mysql - 仅选择与 MYSQL 匹配的邮政编码

MySQL 左连接计数

MYSQL:如何从表中提取以下数据?

mysql - SQL 表或字段