2016-10-07 1 views
1

Ich arbeite an einer Abfrage, die mit Einfügungsdatensätzen beschäftigen und die Spaltenwerte aktualisieren muss, wenn Primärschlüssel dupliziert ist.Wie man Spalten annulliert, die nicht mit doppeltem Schlüsselupdate in mysql aktualisiert werden

In meinem Fall Spaltennamen und Werte wie als JSON-Objekt kommen unter

{ 
    "col1": "val1", 
    "col2": "val2", 
    ..... 
} 

Meine Tabelle enthält 5 Spalten und im JSON-Objekt kann ich nur 2 oder 3 Spalten von 5.

haben

Now Wie annulliere ich die Spalten, die nicht mit der Abfrage aktualisiert werden?

Das habe ich bisher ausprobiert.

$columns = implode(', ', array_keys($requirement)); 
$values = array_values($requirement); 
$placeholders = implode(', ', array_fill(0, count($values), '?')); 

$updatedReq = $requirement; 
unset($updatedReq['requirement_id']); 
unset($updatedReq['buyer_id']); 

$updated = array_keys($updatedReq); 
array_walk($updated, function(&$value, $key) { $value .= '= ?'; }); 
$updatedPlaceholders = implode(', ', $updated); 
$updatedVal = array_values($updatedReq); 

$finalVal = array_merge($values, $updatedVal); 

$sql = "INSERT INTO requirements ($columns) VALUES ($placeholders) ". 
        "ON DUPLICATE KEY UPDATE $updatedPlaceholders"; 
$db->query($sql); 
$db->executeWithArray($finalVal); 

$ Voraussetzung ist ein assoziatives Array mit Schlüssel als Spaltennamen und Werte sind die Werte in der Tabelle

Tabellenstruktur

CREATE TABLE requirement(
     id integer PRIMARY KEY AUTO_INCREMENT, 
     col1 varchar(20) DEFAULT NULL, 
     col2 varchar(20) DEFAULT NULL, 
     col3 varchar(20) DEFAULT NULL, 
     col4 varchar(20) DEFAULT NULL, 
     col5 varchar(20) DEFAULT NULL, 
     created datetime DEFAULT CURRENT_TIMESTAMP, 
     updated datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) 

HINWEIS aktualisiert werden: REPLACE INTO ist keine Option weil eine der Spalten einen Datumswert hat, der nicht geändert werden sollte, während der Wert aktualisiert wird.

+0

Können Sie bitte die Tabellenstruktur angeben? – rbr94

+0

Bearbeitet mit der Tabellenstruktur –

Antwort

1

Ihre ON DUPLICATE KEY Extend alle Spalten enthalten, die Sie beeinflussen möchten, mit der VALUES() Funktion wie so:

ON DUPLICATE KEY UPDATE 
    `val1` = VALUES(`val1`), 
    `val2` = VALUES(`val2`), 
    `val3` = VALUES(`val3`), 
    `val4` = VALUES(`val4`), 
    `val5` = VALUES(`val5`) 

Wenn Ihr INSERT keinen Wert für eine gegebene Spalte bestanden hat, dann wird VALUES(`unpassed_column`) ergeben NULL und Dies ist der neu gespeicherte Wert für diese Zeile.

+0

Sie meinen col1, col2 .... Statt val1, val2 ..., oder? –

+0

Unabhängig davon, welche Spalten benannt sind, habe ich sie beim Testen möglicherweise verwechselt. Also ja. –

+0

Danke ... Das hat geholfen –

Verwandte Themen