2015-03-13 3 views
0

У меня возникли проблемы с пониманием этого ON DUPLICATE KEY UPDATE sql syntax. Все они используют очень маленькие примеры.INSERT ... ON DUPLICATE KEY UPDATE (PHP: PDO)

Нужно ли мне идти:

INSERT INTO skaters (id,name,team,position,games_played,goals,assists,points,plus_minus,penalty_minutes,power_play_goals,power_play_points,shorthand_goals,shorthand_points,winning_goals,overtime_goals,shots,shot_percentage,time_on_ice_pg,faceoff_win_percentage) VALUES (:id,:name,:team,:position,:games_played,:goals,:assists,:points,:plus_minus,:penalty_minutes,:power_play_goals,:power_play_points,:shorthand_goals,:shorthand_points,:winning_goals,:overtime_goals,:shots,:shot_percentage,:time_on_ice_pg,:faceoff_win_percentage) 
ON DUPLICATE KEY UPDATE name=values(name),team=values(team),position=values(position),games_played=values(games_played),goals=values(goals),assists=values(assists),points=values(points),plus_minus=values(plus_minus),penalty_minutes=values(penalty_minutes),power_play_goals=values(power_play_goals),power_play_points=values(power_play_points),shorthand_goals=values(shorthand_goals),shorthand_points=values(shorthand_points),winning_goals=values(winning_goals),overtime_goals=values(overtime_goals),shots=values(shots),shot_percentage=values(shot_percentage),time_on_ice_pg=values(time_on_ice_pg),faceoff_win_percentage=values(faceoff_win_percentage); 

мне было интересно, если есть ярлык для обновления упомянули все значения прошедших конференций. Или просто более сжатый способ или запись вместо огромного списка title = values ​​(title). Могу ли я, например, (name,team,position,...)=values(name,team,position,...)?

+2

Там всегда 'ЗАМЕНЫ INTO' если вы собираетесь топать все равно. – tadman

+0

См. Здесь также - не дублирующий вопрос, но связанный: http://stackoverflow.com/questions/11235501/mysql-insert-row-on-duplicate-key-update-multiple-columns –

+0

Не идеален, но я думаю это мое лучшее решение. Будет менее эффективным, но меня больше волнует смехотворно тупой оператор SQL. – Jonathon

ответ

2

Насколько я знаю, вы должны указать каждый отдельно.

Вы можете сэкономить некоторые хлопоты/опечатки, построив его из массива:

$flds = array('name', 'team', 'position', ...) 
$sql = 'INSERT INTO table (id'; 
foreach ($flds as $f) 
    $sql .= ','.$f; 
$sql .= ') VALUES (:id'; 
foreach ($flds as $f) 
    $sql .= ',:'.$f; 
$sql .= ') ON DUPLICATE KEY UPDATE '; 
$sep = '';. 
foreach ($flds as $f) { 
    $sql .= "$sep$f=values($f)"; 
    $sep = ', '; 
} 
Смежные вопросы