質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

3723閲覧

MySQLでの値があれば上書き、なければ追加について

ataru2222

総合スコア272

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2020/06/20 22:11

前提・実現したいこと

現在MySQLにて値があれば上書き、なければ新規追加という処理を行おうとしています。
その中で、ON DUPLICATE KEY UPDATE 構文を扱うこちらの記事を拝見しました。

http://bashalog.c-brains.jp/17/06/30-100000.php

MySQLにて値があれば上書き、なければ新規追加という処理を実現したいです。
詳しい方いらっしゃいましたら、ご教示ください。
よろしくお願いいたします。

発生している問題・エラーメッセージ

製品名が同じ値があるのに上書きされずにどんどん新規追加登録されてしまう。

該当のソースコード

INSERT INTO test_tbl (製品名,製品タイプ,色コード) VALUES('test66','Type3','red') ON DUPLICATE KEY UPDATE 製品名 = VALUES (製品名);

試したこと

・すでに重複した値(製品名)があるとできないのかと思い、同じ製品名を1つだけ残しテスト
→上書きされずに全く同じ情報でもどんどん新規追加してしまう。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
MySQL ver8.0.20

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

製品名のダブリをさせないなら製品名カラムにunique属性をつけてください
逆にそうなると製品名=values(製品名)はおかしいですね
ユニークカラム以外のカラムをアップデート対象としてください

投稿2020/06/21 03:27

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ataru2222

2020/06/21 21:23

回答していただき、ありがとうございました。 Unique属性を扱う事知らなかったです。
guest

0

ベストアンサー

IDにPrimary KeyをセットしてAUTO_INCREMENTで付番しているなら、「製品名」カラムにUNIQUE KEY指定をすれば、ON DUPLICATE KEY UPDATEは製品名に対しても使えます。
※ALTER TABLEをかけるなら、既に重複している製品名があるとエラーになるはずなので、レコードは重複がないようにきれいにしてからですね。

ちなみに
ON DUPLICATE KEY UPDATE
は、重複していたときにそのレコードをどうUPDATEするか、で、
製品名 = VALUES (製品名)
は製品名をもとの値で上書き更新していることになるので意味がなくリソースも無駄に使うことになるのでは?

INSERTを無視するだけなら
INSERT IGNORE INTO~
というのもあるので、そちらを使うのも検討してもいい気がします。

あと、SQLだけでなくテーブル定義も書いておいたほうが回答しやすいですね。

投稿2020/06/21 02:22

yoshi123

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ataru2222

2020/06/21 21:24

回答していただき、ありがとうございました。 すごく丁寧で分かりやすかったです。
guest

0

ON DUPLICATE KEY
は「重複キーにおいては」なので、キーが重複しなければINSERTになるのは道理です。
テーブル定義どうなってるか分からないですが、AUTOINCREMENTでID指定してませんか?

投稿2020/06/20 22:45

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ataru2222

2020/06/20 23:33

m.ts10806様 返信ありがとうございます。 まさにIDを持たせてAUTOINCREMENT設定にしております。 この場合はこのON DUPLICATE KEY構文は使えない感じなのでしょうか? 新規登録時に同じ名前での登録は避けたいと考えております。 よろしくお願いいたします。
m.ts10806

2020/06/20 23:58

製品名 = VALUES (製品名); ここでPKを指定したら良いだけでは? ドキュメントも確認してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問