У меня есть таблица MySQL со следующими полями:Состояние управляемой INSERT и UPDATE в одном запросе
- ID
- ТЕЛЕФОН
- ИМЯ
- ГОРОД
- СТРАНА
Используя 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, в зависимости от количества полей (я собираюсь добавить больше полей в будущем) и записей. Есть ли способ каким-либо образом преобразовать их в один запрос или по меньшей мере оптимизировать код, минимизируя количество запросов?
Я думаю, вы должны взглянуть на MySQL документации для INSERT - особенно пункта "ON KEY UPDATE DUPLICATE". Конечно, если вы его используете, вам нужно сделать номер телефона уникальным. –
Я действительно рассматривал метод ON DUPLICATE KEY UPDATE. Тем не менее, мне нужно запустить условие на отдельных полях в записи, которая была дублирована. Только те поля должны быть обновлены, если у меня есть значение NON-NULL. Например, если запись уже существует для телефона 123456, я бы не захотел перезаписать всю запись; только те поля, где у меня есть реальная ценность, чтобы заменить его. – TheLearner