以下のようなテーブルを作成して

CREATE TABLE IF NOT EXISTS `TEST1` (
`ID` varchar(15) NOT NULL DEFAULT '',
`DATE_PARAM` date NOT NULL DEFAULT '0000-00-00',
`PRICE` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`,`DATE_PARAM`)
) ENGINE=MyISAM DEFAULT CHARSET=ujis;ID

PRIMARYの場合にPRICEの値が、
格納されている値より
安い場合だけ更新したいです。
それ以外の場合は、INSERTしたいです。

以下のSQLに条件文など足せるのでしょうか?
INSERT INTO TEST1
(ID,DATE_PARAM,PRICE)
VALUES (1,'2009-01-19',100) ON DUPLICATE KEY UPDATE PRICE=100

わかる方いましたら、よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/01/22 18:06:27
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:mikuni1966 No.1

回答回数106ベストアンサー獲得回数1

ポイント10pt

DBの種類やバージョンの記載がないと回答得られなくないでしょうか?

あと気になったのですが

PRICEの値が格納されている値より安い場合だけ更新・・となっていますが

SQL文の例で PRICE=100 って書かれると 安い場合 じゃないのでは?

id:hopefully

あ、すいません。

DBのバージョンは、MYSQL5.2です。

SQL文の例はON DUPLICATE KEY UPDATEで処理を

行いたいので、書いてみました。

それと、ちょっと付け足しが足りなかったですね。

すいません。

TEST1には

IDが1でDATE_PARAMが2009-01-19でPRICEが50というのが入ってます。

なので、上記SQLを実行すると、50が100に変わらないようにするには

どうしたらいいでしょうか??

INSERT INTO TEST1

(ID,DATE_PARAM,PRICE)

VALUES (1,'2009-01-19',40) ON DUPLICATE KEY UPDATE PRICE=40

の場合は50が40に変更。

よろしくお願いします。

2010/01/19 13:10:53
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント10pt

問題点があります。

高い場合は、INSERTしたいとありますが、その場合、既にプライマリーキーは存在することになります。

(安いほうで)

そこに 高い金額のものを INSERTすると ユニークで エラーになりませんでしょうか?

IDを更新して INSERTするのでしょうか?

id:hopefully

あ、間違えてますね。

質問が。。。

すいません。

基本的に、PRIMARYで安い値段を更新したいだけです。

2010/01/19 13:15:48
id:chuken_kenkou No.3

回答回数722ベストアンサー獲得回数54

ポイント60pt

要件が分かりにくいですが、

(id,date_param)の主キー値で、

  1. 行が存在しなければ格納
  2. 行が存在していた場合、price値が最小となる場合は更新
  3. 行が存在していた場合、price値が最小とならなければ何もしない

という感じでいいでしょうかね?



1.最小値でないので、更新は発生しない例

insert into test1(id,date_param,price) 
 values('1','2009-01-19',100)
 on duplicate key update price=least(price,values(price))


2.最小値なので、更新が発生する例

insert into test1(id,date_param,price) 
 values('1','2009-01-19',40)
 on duplicate key update price=least(price,values(price))


3.新規の行で、追加が発生する例

insert into test1(id,date_param,price) 
 values('4','2009-01-19',100)
 on duplicate key update price=least(price,values(price))

なお、上記のon duplicate key updateでは、次の操作をしています。

  • values(price)は、そのinsert文のvaluesで列に与えられた値を参照しています
  • least(price,values(price))では、(id,date_param)が一致する格納済のprice値と、insertしようとしているprice値のうち、小さい方で更新します
id:hopefully

まさしく、このSQLです。

ありがとうございます。

2010/01/22 18:05:54
  • id:taknt
    INSERTじゃなくて
    REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...
    ってので やったらいいんじゃないのかなぁ?

    ま、SELECT文を後ろに書いて使えるなら ON DUPLICATE KEY UPDATEでもいいかもしれんが・・・。
    環境がないので 確認できません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません