【发布时间】:2015-05-02 18:57:11
【问题描述】:
我有一个包含以下字段的 MySQL 表:
- 身份证
- 电话
- 姓名
- 城市
- 国家
使用 PHP,我正在从文本文档中读取逗号分隔的值转储,解析值并将记录插入到表中。供参考,代码如下:
<?php
// Includes
require_once 'PROJdbconn.php';
// Read comma-separated text file
$arrindx = 0;
$i = 0;
$filehandle = fopen(PROJCDUMPPATH.PROJCDUMPNAME,"rb");
while (!feof($filehandle)){
$parts = explode(',', fgets($filehandle));
$contnames[$arrindx] = $parts['0'];
$contnumbers[$arrindx] = preg_replace('/[^0-9]/','',$parts['1']);
$arrindx += 1;
}
fclose($filehandle);
$arrindx -= 1;
$filehandle = NULL;
$parts = NULL;
// Build SQL query
$sql = "INSERT INTO Contact_table (PHONE, NAME) VALUES ";
for ($i = 0; $i < $arrindx; ++$i){
$sql .= "('".$contnumbers[$i]."', '".$contnames[$i]."'),";
}
$i = NULL;
$arrindx = NULL;
$contnames = NULL;
$contnumbers = NULL;
$sql = substr($sql,0,strlen($sql)-1).";";
// Connect to MySQL database
$connect = dbconn(PROJHOST,PROJDB,PROJDBUSER,PROJDBPWD);
// Execute SQL query
$query = $connect->query($sql);
$sql = NULL;
$query = NULL;
// Close connection to MySQL database
$connect = NULL;
?>
现在,如您所见,这段代码盲目地将所有记录转储到表中。但是,我需要修改代码逻辑:
Read text file and parse records into arrays (already doing)
For each record in text file
Check if PHONE exists in the table
If yes,
For each field in the text file record
If text file field != NULL
Update corresponding field in table
Else
Skip
If no,
INSERT record (already doing)
如果逻辑不是非常清楚,我深表歉意,请随时问我是否有任何方面让您感到困惑。所以,我理解这个逻辑会涉及大量的 SELECT、UPDATE 和 INSERT 查询,具体取决于字段(我打算在未来添加更多字段)和记录的数量。有没有办法以某种方式将它们变成单个查询或通过最小化查询数量来优化代码?
【问题讨论】:
-
我认为您必须查看有关 INSERT 的 MySQL 文档 - 特别是子句“ON DUPLICATE KEY UPDATE”。当然,如果您要使用它,您必须使电话号码列唯一。
-
我确实考虑过 ON DUPLICATE KEY UPDATE 方法。但是,我需要对发现重复的记录中的各个字段运行条件。只有在我提供 NON-NULL 值的地方才会更新那些字段。例如,如果电话号码 123456 的条目已经存在,我不想覆盖整个记录;只有那些我有真正价值的字段才能替换它。
标签: php mysql database performance