【问题标题】:MYSQL: Issue Multiple rows getting inserted for the same entryMYSQL:为同一条目插入多行问题
【发布时间】:2018-02-25 17:26:22
【问题描述】:

即使在使用选择查询之后,我仍然会插入多行同名的行。

以下是我面临上述问题的类似代码示例。

$current_timestamp=date('Y-m-d H:i:s'); //current date-time

$query = "SELECT * FROM table WHERE name = 'variable name' ";
$result=try_mysql_query($link, $query);

if(mysqli_num_rows($result)) 
{
    $updatequery = "UPDATE account_extension SET 
     updated_at = '$current_timestamp' WHERE name = 'variable name'";
    $result = try_mysql_query($link, $updatequery);
} 
else
{
    $insertsql="INSERT INTO table(`name`,`updated_at`) 
    VALUES ('variable name','$current_timestamp')";
    $result = try_mysql_query($link,$insertsql);
}

【问题讨论】:

    标签: mysql sql mysqli sql-insert


    【解决方案1】:

    在 MySQL 中执行此操作的正确方法是使用单个语句。

    首先,您需要一个唯一索引:

    create unique index ind_ account_extension_name on account_extension(name);
    

    那么,你可以这样做:

    insert into account_extension(name, updated_at)
        values (?, ?)
        on duplicate key update updated_at = values(updated_at);
    

    请注意,我还用参数占位符替换了变量。使用参数是向查询传递值的正确方法。

    这种方法有什么优势?

    • 它简化了应用程序编码。
    • 数据库强制执行唯一约束,因此它是多线程安全的。
    • name 的唯一性得到保证,无论字段如何插入或更新。

    【讨论】:

    • 感谢您的回答。我完全理解您的方法,但我需要向您询问一件事我的方法中是否有任何错误或错误会导致重复输入?由于我在这个表中有数百万行,这就是我没有为这个表创建唯一键索引的原因。因为这会增加执行相同方法的复杂性。
    • @Axar 。 . .我不知道你所说的复杂性是什么意思。对我来说,一条 SQL 语句似乎比三个 SQL 语句简单得多,其中包含条件逻辑。尽可能让数据库确保数据完整性。
    • 按照您的方法,我们仍然需要执行相同的方法。相同的选择查询来检查是否有用户条目并基于执行更新或插入查询。所以我没明白你说的只在一个查询中完成?
    • @Axar 。 . .您在数据库中创建一次索引/约束。然后你执行一个insert
    • 我在数据库中创建了一个唯一索引。现在我删除了完整的代码,只执行插入查询。获取 Mysql 错误 #1062 - 键“名称”的重复条目“变量名称”,因此不更新现有条目
    【解决方案2】:

    在您的代码中更新以下行:

    $query = "SELECT * FROM table WHERE name = 'variable name' ";
    

    $query = "SELECT * FROM table WHERE name like '%variable name%' ";
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 2012-12-16
      相关资源
      最近更新 更多