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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

1229閲覧

MariaDB AUTO_INCREMENTのデータ列を無視した「INSERT INTO ... ON DUPLICATE KEY UPDATE ...」による更新

shuken

総合スコア1

MySQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

1クリップ

投稿2021/08/14 15:32

前提・実現したいこと

以下テーブルにおいて、追加するデータが同じtag、tw_idであれば更新、そうでなければ新たに追加とするSQLを作成したいと考えています。
(SQLの実行はPHPにて行います。)

create table tw ( id int(11) not null auto_increment primary key, tag varchar(25) primary key, tw_id varchar(64) primary key, tw_date varchar(25), tw_txt text, tw_rt int(10), tw_fav int(10) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

うまくいっていないSQLは以下のとおりです。
(PHPのプレースホルダで実行しています。)

INSERT INTO tw (id, tag, tw_id, tw_date, tw_txt, tw_rt, tw_fav) VALUES (null, :tag, :tw_id, :tw_date, :tw_txt, :tw_rt, :tw_fav) ON DUPLICATE KEY UPDATE tag=':tag', tw_id=':tw_id', tw_date=':tw_date', tw_txt=':tw_txt', tw_rt=':tw_rt', tw_fav=':tw_fav';

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

tag、tw_idが同じデータが来てもすべてinsertされてしまいます。(idは新規付番)
単純に、auto_incrementのidの値が異なるから追加されたように思いますが、
ネット上には「nullであれば更新できる」との情報があったりして、実現可否を判断するに至っていません。

試したこと

insert into側でidに触れないようにしてもダメでした。

INSERT INTO tw (tag, tw_id, tw_date, tw_txt, tw_rt, tw_fav) VALUES (:tag, :tw_id, :tw_date, :tw_txt, :tw_rt, :tw_fav) ON DUPLICATE KEY UPDATE tag=':tag', tw_id=':tw_id', tw_date=':tw_date', tw_txt=':tw_txt', tw_rt=':tw_rt', tw_fav=':tw_fav';

update側にKEYを入れないようにしてもダメでした。

INSERT INTO tw (id, tag, tw_id, tw_date, tw_txt, tw_rt, tw_fav) VALUES (null, :tag, :tw_id, :tw_date, :tw_txt, :tw_rt, :tw_fav) ON DUPLICATE KEY UPDATE tw_date=':tw_date', tw_txt=':tw_txt', tw_rt=':tw_rt', tw_fav=':tw_fav';

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

PHP
PHP 7.4.21

MariaDB
Ver 15.1 Distrib 10.4.20-MariaDB, for Linux (x86_64) using readline 5.1

長文申し訳ありません。
何かしら方策ありましたら、ご教示のほどよろしくお願いします。

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

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

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

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

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

hoshi-takanori

2021/08/14 20:11

primary key が id, tag, tw_id の組み合わせなら、ON DUPLICATE KEY UPDATE は id, tag, tw_id すべての組み合わせが重複した場合になりますが、id の値を null や省略した場合は新規付番されるので、重複は起こり得ないのでは…。
m.ts10806

2021/08/14 20:47

idにnullを入れていたら必ずAIが作動します。
shuken

2021/08/15 01:05

皆さんご助言ありがとうございます。 例えば、以下には(mysqlではありますが)上書きされるような記載があるので、何らか上手い捌き方があるのかもしれない、と思ったところでした。もうちょっと調べてみます。 https://commerce-engineer.rakuten.careers/entry/tech/0005
m.ts10806

2021/08/15 01:08

自身で制御したいのでしたらAIで自動発行ではなく、シーケンスを自身で管理、発行されたほうが良いですね。
hoshi-takanori

2021/08/15 01:32

参考にされた記事のテーブルは primary key が id だけで、uniq が unique key で、ご質問内容とは違うので、そのまま当てはめることはできないと思います。 tw テーブルも、primary key を id だけにして、tag と tw_id の組み合わせを unique にすれば良いのでは。
shuken

2021/08/15 02:04

お返事ありがとうございます。 なお、hoshi-takanoriさんが仰ったように、両項目をuniqueにしたところ、思った動きをしました。 unique keyとprimary keyとで動きが違うことを先に確認すべきでした。申し訳ありません。 unique keyとして問題ないかを検討した上で進めていきたいと思います。 まずはありがとうございました。
guest

回答1

0

自己解決

質問前提と条件が変わっており、他の皆さんの参考になるか分かりませんが、
auto_incrementの項目以外がprimary keyでなくunique keyであれば、思った動きをしました。

primary keyである必要がなければ、unique keyでいきたいと思います。
また、primary keyの必要がある場合は、auto_incrementを用いず、別の方法を検討します。
コメントいただいたhoshi-takanoriさん、m.ts10806さんありがとうございました。

ALTER TABLE tw ADD PRIMARY KEY (id), ADD UNIQUE KEY tw_id (tag,tw_id);

投稿2021/08/15 02:19

編集2021/08/15 02:21
shuken

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問