Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL:为同一条目插入多行_Mysql_Sql_Mysqli_Sql Insert - Fatal编程技术网

MYSQL:为同一条目插入多行

MYSQL:为同一条目插入多行,mysql,sql,mysqli,sql-insert,Mysql,Sql,Mysqli,Sql Insert,即使在使用selectquery之后,我仍然会得到多个插入了相同名称的行 下面是我面临上述问题的类似代码的示例 $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))

即使在使用selectquery之后,我仍然会得到多个插入了相同名称的行

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

$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中实现这一点的正确方法是使用单个语句

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

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);
注意,我还用参数占位符替换了变量。使用参数是将值传递到查询中的正确方法

这种方法的优点是什么

它简化了应用程序编码。 数据库强制执行唯一约束,因此它是多线程安全的。 无论字段如何插入或更新,都保证名称的唯一性。
更新代码中的以下行:

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


希望这有帮助

谢谢你的回答。我完全理解您的方法,但有一件事我需要向您询问,我的方法中是否存在任何错误或错误,导致重复输入?由于此表中有数百万行,因此我没有为此表创建唯一的键索引。因为这会增加执行相同方法的复杂性。@Axar。我不知道你所说的复杂性是什么意思。对我来说,一条SQL语句似乎比三条SQL语句简单得多,其中复杂的是条件逻辑。尽可能让数据库确保数据的完整性。按照您的方法,我们仍然需要执行相同的方法。相同的select查询用于检查是否存在用户条目,并基于执行更新或插入查询的条目。所以我不明白你是怎么说的在一个查询中就这么做的?@Axar。在数据库中创建一次索引/约束。然后执行一次插入。我在数据库中创建了一个唯一的索引。现在我删除了完整的代码,只执行insert查询。获取Mysql错误1062-键“name”的条目“variable name”重复,因此不更新现有条目
$query = "SELECT * FROM table WHERE name like '%variable name%' ";