【问题标题】:Insert uniquely into MySQL table without unique keys在没有唯一键的情况下唯一地插入 MySQL 表
【发布时间】:2011-06-27 14:48:21
【问题描述】:

我想将数据唯一地插入到我的一个 MySQL 表中。也就是说,如果表中已经存在相同的条目(所有列包含相同的值),则应该取消插入操作。这可以通过定义唯一键并处理即将发生的错误来轻松完成,但我无法更改表结构。

我确信即使在没有唯一键的表中也有一种简单的方法可以捕捉到这一点。当然,我可以提前使用SELECT 语句手动检查此类记录的存在,但同时可能存在修改我的表的并发实例(在使用SELECT 的检查和实际的INSERT 之间)。

我想在一个 SQL 命令中执行检查和INSERT 操作。谁能指出我正确的方向?

【问题讨论】:

  • 您在表中使用键吗?您可以使用“插入重复键”。 dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
  • @Tim 这需要唯一的密钥,而@Björn Marschollek 说他不能添加这样的密钥。
  • 为什么不能改变表格,这是最好的方法。任何其他方式都是一种黑客攻击,如果在获得锁定之后运行查询期间发生了一些不好的事情并且没有释放锁定,那么没有其他东西可以插入它。

标签: mysql insert unique


【解决方案1】:

让我们假设您的表中有 5 列 - col1、col2、col3、col4、col5。并假设与您尝试插入的这些列相对应的数据位于变量中 - $col1、$col2、$col3、$col4、$col5(我假设 PHP 作为您的语言,但请按照以下方式修改变量格式你的命名法)。

所以你的插入可能看起来像:

INSERT INTO `tableA` (`col1`, `col2`, `col3`, `col4`, `col5`)
SELECT $col1, $col2, $col3, $col4, $col5
FROM `tableA`
WHERE NOT EXISTS (SELECT 1
    FROM `tableA`
    WHERE `col1` = $col1
    AND `col2` = $col2
    AND `col3` = $col3
    AND `col4` = $col4
    AND `col5` = $col5);

另一种选择可能是:

INSERT INTO `tableA` (`col1`, `col2`, `col3`, `col4`, `col5`)
SELECT $col1, $col2, $col3, $col4, $col5
FROM `tableA`
WHERE `col1` = $col1
AND `col2` = $col2
AND `col3` = $col3
AND `col4` = $col4
AND `col5` = $col5
HAVING COUNT(1) = 0;

希望这会有所帮助。

【讨论】:

  • 这将在具有已提交读隔离级别的事务中工作吗?
【解决方案2】:

您可以对查询使用表锁,并且在您的查询完成处理之前,其他进程不会修改它。

检查此链接: http://www.mssqlcity.com/Articles/Adm/SQL70Locks.htm

然后照你说的做 " 这样的记录事先使用了 SELECT 语句,但在此期间可能会有并发实例修改我的表(在使用 SELECT 进行检查和实际 INSERT 之间)。"

【讨论】:

  • 文章是MSSQL,Q.是MySQL
  • 请注意,您必须非常严格地进行测试,以确保表不会永远被锁定,或者您的SELECT + INSERT 不会阻塞表几个小时。
【解决方案3】:

没有唯一键,确保唯一行的唯一方法是不允许表上的任何写并发(锁定它们或使用可序列化的隔离级别)

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2022-08-21
    相关资源
    最近更新 更多