リクエスト詳細
✨ 既存アプリの改善
対応完了
対象アプリ: 合体ドロップ
schema.sqlのサンプルスコアが更新実行のたびに重複挿入される
1. 不具合の内容:
schema.sql末尾にある動作確認用ダミースコア4件(「サンプル太郎」「Hanako」「Veggie Lover」「テスター」)のINSERT文が無条件・無ガードで実行される。ファイルが初回インストール以降も再実行される設計になっている場合、実行の都度これら4件が重複してscoresテーブルへ追加され続ける。
2. 根拠・発生しそうな条件:
schema.sql冒頭〜中盤のALTER群(play_token列追加、mode列追加、各種INDEX追加)はすべて`information_schema`でカラム/インデックスの存在確認をしてから実行するガード付きになっており、コメントにも「既存インストールにも○○列を安全に追加する」「一部MySQLでは重複追加がエラーになるため、未存在時のみALTERを実行する」と明記されている。これはschema.sqlがバージョンアップのたびに既存インストール環境へ再実行される運用を前提とした設計であることを示す。ところが末尾のサンプルデータ`INSERT INTO scores (...) VALUES (...)`にはそうした重複防止ガード(件数チェックやINSERT IGNORE、一意キー制約による重複排除など)が一切無く、`CURDATE()`/`NOW()`を使っているため実行するたびに「本日のスコア」として新規4行が追加されてしまう。
この結果、v1.112.0で追加された「タイトル画面の今日の参加人数」表示、v1.125.0の「参加人数を踏まえた上位パーセント」表示、日替わり/週間/月間/歴代ランキングの参加者数・順位計算などが、実プレイヤーではないダミーデータの重複によって水増しされ、更新のたびに悪化していく。
3. 期待動作:
schema.sqlが初回インストール時以降に何度実行されても、サンプルスコアは最初の1回だけ投入され、再実行時には重複して増えないこと。
4. 修正方針:
- サンプルINSERTの直前に「scoresテーブルの行数が0のときだけ実行する」動的SQLガードを追加する(他の箇所と同様にIF文+PREPARE/EXECUTEパターンで実装可能)。
- もしくはsettingsテーブルに`seed_data_installed`のようなフラグを1回だけ書き込み、既に存在すればサンプルINSERTをスキップするようにする。
- 併せて、既にダミーデータが複数回重複挿入されてしまった既存環境向けに、`player_name IN ('サンプル太郎','Hanako','Veggie Lover','テスター') AND score IN (1240,2480,860,3520)`など特徴的な組み合わせで重複行を検出し、各組み合わせにつき最古の1件を残して他を削除するクリーンアップ用のSQL(または管理用スクリプト)を用意する。
schema.sql末尾にある動作確認用ダミースコア4件(「サンプル太郎」「Hanako」「Veggie Lover」「テスター」)のINSERT文が無条件・無ガードで実行される。ファイルが初回インストール以降も再実行される設計になっている場合、実行の都度これら4件が重複してscoresテーブルへ追加され続ける。
2. 根拠・発生しそうな条件:
schema.sql冒頭〜中盤のALTER群(play_token列追加、mode列追加、各種INDEX追加)はすべて`information_schema`でカラム/インデックスの存在確認をしてから実行するガード付きになっており、コメントにも「既存インストールにも○○列を安全に追加する」「一部MySQLでは重複追加がエラーになるため、未存在時のみALTERを実行する」と明記されている。これはschema.sqlがバージョンアップのたびに既存インストール環境へ再実行される運用を前提とした設計であることを示す。ところが末尾のサンプルデータ`INSERT INTO scores (...) VALUES (...)`にはそうした重複防止ガード(件数チェックやINSERT IGNORE、一意キー制約による重複排除など)が一切無く、`CURDATE()`/`NOW()`を使っているため実行するたびに「本日のスコア」として新規4行が追加されてしまう。
この結果、v1.112.0で追加された「タイトル画面の今日の参加人数」表示、v1.125.0の「参加人数を踏まえた上位パーセント」表示、日替わり/週間/月間/歴代ランキングの参加者数・順位計算などが、実プレイヤーではないダミーデータの重複によって水増しされ、更新のたびに悪化していく。
3. 期待動作:
schema.sqlが初回インストール時以降に何度実行されても、サンプルスコアは最初の1回だけ投入され、再実行時には重複して増えないこと。
4. 修正方針:
- サンプルINSERTの直前に「scoresテーブルの行数が0のときだけ実行する」動的SQLガードを追加する(他の箇所と同様にIF文+PREPARE/EXECUTEパターンで実装可能)。
- もしくはsettingsテーブルに`seed_data_installed`のようなフラグを1回だけ書き込み、既に存在すればサンプルINSERTをスキップするようにする。
- 併せて、既にダミーデータが複数回重複挿入されてしまった既存環境向けに、`player_name IN ('サンプル太郎','Hanako','Veggie Lover','テスター') AND score IN (1240,2480,860,3520)`など特徴的な組み合わせで重複行を検出し、各組み合わせにつき最古の1件を残して他を削除するクリーンアップ用のSQL(または管理用スクリプト)を用意する。
💬 返信 (3)
🛠 開発を開始しました (機能追加 (vegetable-drop))
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
ご要望ありがとうございます。AI 開発ワーカーが実装を開始します。
通常 5〜30 分で Pull Request を作成し、レビュー後にリリースされます。
📝 開発が完了しました
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
ご要望いただいた内容の実装が完了し、最終チェック段階に入りました。
レビュー (自動) → リリース、の流れで進みます。
もう少々お待ちください。
✅ リリース完了のお知らせ
ご要望いただいた「合体ドロップ」の改善を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
ご要望いただいた「合体ドロップ」の改善を実装し、リリースいたしました。
【ご利用方法】
ダッシュボード: https://www.aiapps.jp/?action=dashboard
アプリ詳細: https://www.aiapps.jp/apps/show.php?slug=vegetable-drop
デモ環境は 1 時間以内に自動構築されます:
https://www.aiapps.jp/demo/vegetable-drop/
ご利用ありがとうございます!
Echo
Iris