MySQL - 如果存在则插入介绍更新

时间:2015-11-16 15:07:20

标签: php mysql sql mysqli

我有从CSV导入数据库的未知密钥和值 我的代码是

while($data = fgetcsv($handle,1000,",",'"'))
{
$data=array_map('addslashes',$data); // apply addslashes() to all values
$data=array_combine($csv_fields,$data); // csv fields assoc (key=>value)
$data=array_intersect_key($data,$tbl_fields); // discard redundant
$tbl_fields_str=implode("`,`",array_keys($data));
$tbl_vals_str=implode("','",array_values($data));
$q="INSERT INTO `cmid` (`cmid`,`$tbl_fields_str`) VALUES ('$cmidtrenutni','$tbl_vals_str') ON DUPLICATE KEY UPDATE (`$tbl_fields_str`) VALUES ('$tbl_vals_str')";
$conn->query($q); 
}

我需要插入,如果存在,请更新。 我尝试上面的代码,但不起作用 我找到类似http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html的东西 但这对我的方式没有帮助,因为我的表没有定义字段。每个输入的键和值都不同 任何解决方案如何做到这一点?

4 个答案:

答案 0 :(得分:2)

这是您的查询:

INSERT INTO `cmid` (`cmid`, `$tbl_fields_str`)
    VALUES ('$cmidtrenutni', '$tbl_vals_str')
    ON DUPLICATE KEY UPDATE (`$tbl_fields_str`) VALUES ('$tbl_vals_str');

问题在于UPDATE部分。您需要拆分值,使其如下所示:

INSERT INTO `cmid` (`cmid`, `$tbl_fields_str`)
    VALUES ('$cmidtrenutni', '$tbl_vals_str')
    ON DUPLICATE KEY UPDATE
         col1 = newcol1val,
         col2 = newcol2val,
         . . .

您使用的简写语法无效。

答案 1 :(得分:1)

试试这个:

$q="INSERT INTO `cmid` (`cmid`,`$tbl_fields_str`) VALUES ('$cmidtrenutni','$tbl_vals_str') ON DUPLICATE KEY UPDATE cmid=cmid";

但我更喜欢使用INSERT IGNORE来解决您的问题:

$q="INSERT IGNORE INTO `cmid` (`cmid`,`$tbl_fields_str`) VALUES ('$cmidtrenutni','$tbl_vals_str')";

答案 2 :(得分:0)

要从csv文件导入,请查看LOAD DATA INFILE语句或mysqlimport实用程序。

答案 3 :(得分:0)

你不能拥有"未知" mysql DB中的列。如果你想在mysql表中存储键值对,你应该有一个包含两列的表:一个名为" key"而另一个"价值"。添加一个额外的列" cmid"把你的对分组。

此表应具有" cmid"的主索引。和"关键"列。

然后您应该使用如下查询插入值:

$sqlVals = "";
foreach ($data as $key => $val) {
   $sqlVals .= "($cmidtrenutni, $key, $val),";
}
$sqlVals = substr($sqlVals, 0, -1); //remove last comma.

$query = "REPLACE INTO `myTable` (`cmid`, `key`,`value`) VALUES $sqlVals";