2017-07-28 2 views
0

Ich habe SO Fragen gegraben und keine Adresse mein spezifisches Problem ... Ich habe die folgenden relevanten Themen gelesen: Here, vergeblich.MySQL ON DUPLICATE KEY UPDATE nur einfügen, nicht aktualisieren

Ich habe eine einfache Tabelle mit den folgenden Daten:

|-----------------------------------------------------------------------------| 
| id | contractor_id | section_id | page_id | modified | timestamp |  
|-----------------------------------------------------------------------------| 

Hier ist die create-Anweisung:

CREATE TABLE `reusable_page_modified` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `contractor_id` int(11) DEFAULT NULL, 
    `section_id` int(11) DEFAULT NULL, 
    `page_id` int(11) DEFAULT NULL, 
    `modified` int(1) NOT NULL DEFAULT '1', 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id_UNIQUE` (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=13844 DEFAULT CHARSET=utf8; 

Jetzt habe ich vier Zeilen in der db gerade jetzt, und sie sind (I ‚ll id und Zeitstempel weglassen, da sie automatisch generiert werden):

|---------------------------------------------------------| 
| contractor_id | section_id | page_id | modified | 
########################################################### 
|  1016  |  309  | 10303 |  0  | 
|---------------------------------------------------------- 
|  1017  |  309  | 10303 |  1  | 
|---------------------------------------------------------- 
|  1073  |  309  | 10303 |  1  | 
|---------------------------------------------------------- 
|  240  |  309  | 10303 |  1  | 
|---------------------------------------------------------- 

ich in der ersten Zeile am konzentrieren, in denen modified ist auf 0 eingestellt. Was ich tun möchte, ist es auf 1, wenn contractor_id, section_id und page_id alle vorhanden sind. Wenn nicht, geben Sie eine neue Zeile ein. Diese

ist, was ich habe:

INSERT INTO `reusable_page_modified` 
    (contractor_id, section_id, page_id, modified) 
    VALUES ('1016', '309', '10303', '1') 
    ON DUPLICATE KEY UPDATE 
    `section_id` = '309' 
    AND `page_id` = '10303' 
    AND `contractor_id` = '1016'; 

Dies schafft eine neue Zeile. Ich denke, ich verstehe das ON DUPLICATE KEY UPDATE Statment nicht so, wie es beabsichtigt war. Ich habe die MySQL-Dokumentation Here gelesen und immer noch keine Hilfe. Was sehe ich hier nicht?

Antwort

1

Sie sind nicht weit davon entfernt, korrekt zu sein, aber Ihre Syntax ist ein bisschen aus. Wenn Sie zuerst ON DUPLICATE KEY arbeiten möchten, wenn ein Datensatz mit doppelten Werten für die Spalten contractor_id, section_id und page_id eingefügt wird, benötigen Sie eine eindeutige Einschränkung für diese drei Spalten. Sie können eine mit dem folgenden hinzu:

ALTER TABLE reusable_page_modified 
ADD CONSTRAINT u_cnst UNIQUE (contractor_id, section_id, page_id); 

nächstes für die eigentliche INSERT Aussage würden Sie verwenden, was Sie haben eine enge, mit der Ausnahme, dass Sie alle Spalten aktualisieren, die keine Aktualisierung erfordern. Stattdessen lassen die drei Spalten allein und stattdessen aktualisieren, um die modified Spalte 1:

INSERT INTO reusable_page_modified 
    (contractor_id, section_id, page_id, modified) 
VALUES ('1016', '309', '10303', '1') 
ON DUPLICATE KEY UPDATE 
    modified = 1 
+0

Ich wusste, dass ich es ein wenig anders dachte als beabsichtigt. Die "modifizierte = 1" macht jetzt Sinn, wenn ich sie anschaue. Auch der Zwang macht Sinn ... Hasse kurzsichtig, wenn du zu lange auf etwas starrst! Danke für deinen Beitrag! – Zak

Verwandte Themen