2017-07-28 7 views
0

J'ai passé en revue des questions SO et aucune adresse mon problème spécifique ... J'ai lu les sujets pertinents suivants: Here, en vain.MySQL ON DUPLICATE KEY UPDATE seulement insérer, ne pas mettre à jour

J'ai une table simple avec les données suivantes:

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

Voici la déclaration créer:

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; 

Maintenant, j'ai 4 lignes dans la db en ce moment, et ils sont (I « ll s'arrêter id et horodatage car ils sont générés automatiquement):

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

Je me concentre sur la première ligne où modified est défini sur 0. Ce que je veux faire est de le mettre à 1 si contractor_id, section_id et page_id existent tous. Sinon, entrez une nouvelle ligne.

C'est ce que j'ai:

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'; 

Cela crée une nouvelle ligne. Je pense que je ne comprends pas le statut ON DUPLICATE KEY UPDATE comme il était prévu. J'ai lu la documentation MySQL Here et toujours pas d'aide. Qu'est-ce que je ne vois pas ici?

Répondre

1

Vous n'êtes pas loin d'être correct, mais votre syntaxe est un peu éteinte. Tout d'abord, si vous voulez que ON DUPLICATE KEY fonctionne lorsqu'un enregistrement avec des valeurs dupliquées pour les colonnes contractor_id, section_id et page_id est inséré, vous aurez besoin d'une contrainte unique sur ces trois colonnes. Vous pouvez ajouter un en utilisant les éléments suivants:

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

Ensuite, pour la déclaration INSERT réelle, vous utiliserez ce que vous avez est proche, sauf que vous mettez à jour toutes les colonnes qui ne nécessitent pas de mise à jour. Au lieu de cela, laissez les trois colonnes seul et à la place de mettre à jour la colonne modified à 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

Je savais que je pensais un peu différemment que prévu. Le 'modified = 1' est logique maintenant que je le regarde. De plus, la contrainte a aussi un sens ... Hâte de devenir myope lorsque vous observez quelque chose pendant trop longtemps! Merci pour votre contribution! – Zak