当前位置: 首页 > 知识库问答 >
问题:

在插入数据库之前检查重复SQL

丌官瀚
2023-03-14

因此,我一直在做一些研究,我需要编写一个INSERT语句,将唯一的客户端名称插入到服务器上的表中。然而,数据库的默认标准中已经有数千个客户端,在插入新客户端时,我们需要在尝试将其添加到系统之前检查它们是否已经存在。

我的问题是,最好/最快的方法是什么?在clients表上运行一个简单的select查询(按ASC排序),并对结果进行二进制搜索或其他操作,或者只执行类似于下面的SQL查询,会更好吗?

IF NOT EXISTS (SELECT 1 FROM clients AS c WHERE c.clientname = ?)
BEGIN
  INSERT INTO clients (clientname, address, ...)
  VALUES (?, ?, ...)
END

这是一个缓慢的陈述吗?我可能必须为每个提交运行插入数百次。

共有2个答案

金皓君
2023-03-14

根据磁盘操作计算查询中SQL的成本并不少见(通常这意味着读/写块(通常是8KB)是成本的单位)。(在内存中,DBs应该改变这一思路)。

如果你有成百上千个项目,每个项目都是...比方说20个字节,那么您的整个数据库将可能适合磁盘上的单个块(400个项目/块)。也许它还需要几个街区,但万岁:这是一个可以忽略的小数字。对于这样一个小数据库,您的数据库可能会在数据库的内存缓存中,您只需要为写访问付费。随着数据库的增长,如果有索引,所需的块访问次数会成倍减少。

如果数据库中已存在某个项目,则您的解决方案和 Bill 的解决方案都不会导致任何写入访问,因此两者的速度应该相同。

有趣的部分是:

每次提交时,我可能需要运行插入数百次。

这意味着您可能会将同一块写入磁盘数百次。如果你能在一步中完成这件事,那会更快。然而,这确实是一个问题,因为我不知道有任何SQL函数允许这种行为。MySQL的INSERT提供了一种在单个语句中指定多个值的方法。这可能是一个相当大的优势(我不知道smart MySQL如何处理这种情况),但它是MySQL特有的,不可移植。

加快速度的另一种方法是不要等到您更改的块写入磁盘。这有可能在没有通知的情况下丢失数据,但可以显着提高性能。同样,这特定于您使用的 DBMS。例如,如果您将MySQL与InnoDB一起使用,则可以在my.ini中设置选项innodb_flush_log_at_trx_commit = 0来记录此行为。

对clients表(按ASC排序)运行一个简单的select查询,并对结果执行二分搜索法或其他操作,这样会更好吗

这将不必要地将大量数据从DBMS复制到客户端(可能在不同的机器上,通过网络协议进行通信)。这对于您的小DB仍然是可以的,但它不能很好地扩展。它可能只有在帮助您在一次操作中将数据保存到磁盘时才有用。

卢书
2023-03-14

标准建议是,如果希望给定的列是唯一的,就创建一个唯一约束。

ALTER TABLE clients ADD UNIQUE KEY (clientname);

然后尝试执行 INSERT,如果没有匹配的行,它将成功,如果存在重复项,它将失败。不需要 SELECT。

 类似资料:
  • 问题内容: 我只想在SQL Server数据库中插入一些条目。但是我需要在插入之前进行检查。关键是该表包括两列和。如果条目与SQL Server数据库中的条目完全相同,则所提供的代码应检查这两列,并防止插入该条目。 这意味着数据表的两列与将要插入的两个条目相同。我检查了论坛,但找不到适合我项目的任何有用的解决方案。 问题答案: 本质上,您可以先使用以下命令检查特定行的存在: (这也使用了参数,而不

  • 我只是想插入一些条目到SQL服务器数据库。但是我需要在插入之前检查一下。关键点在于,该表包含两列和。如果条目与SQL服务器数据库中的条目完全相同,则显示的代码应检查这两列,并防止插入该条目。 这意味着数据表的两列与将要插入的两个条目相同。我检查了论坛,但找不到任何有用的解决方案,我的项目。

  • 问题内容: 在插入数据库之前,我正在使用以下代码检查重复项。对我来说,重复的只考虑重复时,,,,和比赛。 每个值都是在执行此检查之前定义的,由于项目已经存在,所以我的结果总是返回。我转储了“ dupesql”并将命令复制/粘贴到phpmyadmin中,该计数返回0。 问题答案: 您要执行以下操作: 有关更多信息,请参见此处。

  • 问题内容: 我需要进行插入,但是仅当 例如不存在类似记录时: INSERT INTO请求(’user_id’,’subject’,’text’,’time’)值(56,’test’,’test 1234’,6516516) 但要检查另一个记录中是否存在相同的“主题”和“文本”,以: 不插入任何东西 更新“时间”和“ user_id” 对于这两种情况,我都需要使用sql,因为目前还不确定我将使用什么

  • 这是我的代码: 有人能知道这段代码中的错误是什么,请修复它。