Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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 PHP PDO-导入sql文件忽略重复项_Mysql_Database_Pdo_Import - Fatal编程技术网

Mysql PHP PDO-导入sql文件忽略重复项

Mysql PHP PDO-导入sql文件忽略重复项,mysql,database,pdo,import,Mysql,Database,Pdo,Import,我编写了一个脚本,负责将sql文件导入数据库。下面是它的样子: <?php $mysql_host = 'localhost'; $mysql_username = ''; $mysql_password = ''; $mysql_database = ''; try { $db = new PDO('mysql:dbname='.$mysql_database.';host='.$mysql_host,$mysql_username,$mysql_password);

我编写了一个脚本,负责将sql文件导入数据库。下面是它的样子:

<?php

$mysql_host = 'localhost';
$mysql_username = '';
$mysql_password = '';
$mysql_database = '';

try
   {
     $db = new PDO('mysql:dbname='.$mysql_database.';host='.$mysql_host,$mysql_username,$mysql_password);
     $sql = implode(array_map(function ($v) {
        return file_get_contents($v);
        }, glob(__DIR__ . "/*.sql")));

     $qr = $db->exec($sql); 
     echo "Import action - 100% successfull";
   }
   catch (PDOException $e) 
   {
     echo 'Connection failed: ' . $e->getMessage();
}
?>
<BR />



它起作用了。但我想再添加一个函数-避免插入重复项。目前,每次运行脚本时,我都会导入文件,并在最后创建一堆副本。如何使它正常工作?或者至少-覆盖数据库中的所有内容(但我希望避免这种解决方案)

我怀疑您的意思是,其中有许多相同的语句。如果所有语句都是简单语句,并且其中没有带
的字符串值,然后您可以尝试使用:

$sql = implode(';', array_unique(array_map('trim', explode(';', $sql))));
但话说回来,有很多角落的案子

  • 不同的语句可以插入相同的内容
  • 有一个带
    的字符串值(这不一定是问题)
  • 在sql语句中使用不同的分隔符
  • 如果SQL文件中有存储过程/触发器/函数
但这只是一个开始,也许它足以满足您的用例

  • 在需要唯一的字段上创建

  • 可选-如果要在事务中执行多个insert:请确保未将会话的设置为strict。如果设置为“严格”,则将其更改为“非严格”

  • 执行插入

  • 3.b可选:如果您选择不接触sql模式,但仍然希望每个事务执行超过1个insert,则通过在php代码中插入insert之后插入ignore关键字,将insert更改为insert ignore

  • 可选:如果必须在步骤2中更改sql模式,则将sql模式设置回原来的状态
  • 如果使用insert ignore或disable strict sql模式(引用sql模式链接),则会有一些缺点:

    如果严格模式无效,MySQL将插入无效或缺失值的调整值,并生成警告(请参阅第13.7.5.40节“显示警告语法”)。在严格模式下,可以使用INSERT IGNORE或UPDATE IGNORE生成此行为


    你在说什么样的复制品?有同名的文件吗?或者单独的文件包含相同的输入语句吗?我每天上传几次几个sql文件。其中每个表都包含对特定数据库表的insert语句。我想避免的是,当通过文件导入im复制一些值时的情况。原因是这些文件是由备份脚本生成的,所以它们包含所有db数据。我只想导入目标中不存在的数据db@JuliaGalden表上没有主键/唯一键吗?所有文件中的所有内容都是这样的:插入销售(数据、WIZ_ID、客户ID、ANI_ID、医生ID、类型WIZ、文档类型ID、金额、DBS-DATE、DBS-HOUR)值('2015-07-27',1000012',011500010','011500012',3431,1',PARAGON',100.0000',2015-07-27','10:25:56');我希望通过上述文件向其插入数据的所有表中都有主键。但是,我的代码仍然复制了一些行。你能帮助我处理脚本本身吗?如果定义了主键,那么就不能有重复的行,至少主键必须不同。因此,你需要更具体地说明你的意思y重复记录。好的-假设我们有一个名为VISITORS的表,表中有列(id、姓名、电话、销售)。我的主键是id。我有一行:#1 | John | Doyle | 4433222 | 320)。此记录存在于我从中创建sql文件的脱机数据库中,也存在于联机数据库(目标数据库)中。当我使用脚本时,此记录将添加为例如#201 | John | Doyle | 4433222 | 320。我想避免这种情况——我只想插入那些在目标数据库中仍然不可用的行。然后,您需要在不希望重复的字段组合上创建一个唯一的索引。另一个选项是将数据导入到空的临时表中,并使用带有左联接的插入选择将数据移动到不存在的生产表中。在何处创建唯一索引?在脚本或表格中还是在哪里?