首页 文章

在没有唯一键的情况下唯一地插入MySQL表

提问于
浏览
4

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

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

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

3 回答

  • 5

    我们假设您的表中有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;
    

    希望这可以帮助 .

  • 0

    您可以对查询使用表锁,并且在查询完成处理之前,其他任何进程都不会对其进行修改 .

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

    然后按照你所说的那样“预先使用SELECT语句这样的记录,但可能会有同时修改我的表的并发实例(在使用SELECT和实际INSERT的检查之间) . ”

  • 0

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

相关问题