2017-07-28 11 views
0

私はSOの質問を掘り下げましたが、私の特定の問題に対処していません...私は以下の関連スレッドを読んでいます:HereMySQLは重複しないキー更新のみを挿入し、更新しません

私は、以下のデータを持つ単純なテーブルを持っている:ここでは

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

はcreate文である:(

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; 

は今、私は今デシベルで4行を持っている、と彼らは私が

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

私は012の最初の行に集中していますは0に設定されています。私がしたいことは、contractor_idsection_id、およびpage_idがすべて存在する場合、1に設定します。そうでない場合は、新しい行を入力します。

これは私が持っているものです。

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

これは、新しい行を作成します。私は、それが意図された通りにON DUPLICATE KEY UPDATEの文を理解していないと思う。私はMySQLのマニュアルHereを読んだことがあります。私はここで何が見えないのですか?

答えて

1

あなたは正しいとは言いませんが、あなたの構文は少しばかりです。まず、、section_id、およびpage_id列の重複値を持つレコードが挿入されたときにON DUPLICATE KEYを動作させたい場合は、これらの3つの列に一意制約が必要です。あなたは、次の使用して1を追加することができます。

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

次に、実際のINSERT文のあなたは、あなたが任意の更新を必要としないすべての列を更新することを除いて、近くにある持っているものを使用します。代わりに、単独の3つの列を離れ、代わりに1modified列を更新:

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

私は少し違った意図よりも、それについて考えていた知っていました。 'modified = 1'は、今見ていると意味があります。また、拘束も意味をなさない...あなたが何かをあまりにも凝視しているときに、短い視力を得ることを憎む!あなたのご意見ありがとうございます! – Zak

関連する問題