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

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

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

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

Q&A

1回答

204閲覧

特定のテーブル名では使用できない値がある?

XNXSXMXR

総合スコア239

MySQL

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

0グッド

0クリップ

投稿2022/06/23 01:12

MySQL8.0 での現象です。
こんな事初めてなので皆目検討がつかず、質問させていただきます。

データベース

MySQL 8.0.23

AUTOCOMMIT設定 (有効になっているはずです)

mysql> select @@autocommit; +--------------+ | @@autocommit | +--------------+ | 1 | +--------------+ 1 row in set (0.00 sec)

発生している症状

「test1」と「review」というテーブルが存在し、どれも同じテーブル構成です。
この2つのテーブルに、同じ値を保存するINSERT文を発行したのですが・・・

  1. 「test1」テーブルでは、トランザクションを使わなくてもINSERTで保存できる。
  2. 「review」テーブルでは、特定のキーの場合のみ、トランザクションを開始しないとINSERTで保存できない。(かつエラーなし)
  3. 「review」テーブルにて特定のキー以外は、トランザクションを使用しなくてもINSERTで保存できる。
  4. おそらく自分の環境のみ。他人の環境では発生せず。

その特定のキーというのは、主キーとして指定しているカラムに対して、下記の値となります。

systm_no = 1, customer_no = 33

この時のみINSERTしてもエラーとなりません。「customer_no」を違う値にするとINSERTできます。

--- テーブル(reviewテーブルも同じ構成) CREATE TABLE `test1` ( `system_no` bigint unsigned NOT NULL, `customer_no` bigint unsigned NOT NULL, `item_id` varchar(20) NOT NULL, `maker_name` varchar(200) DEFAULT NULL, `item_name` varchar(200) DEFAULT NULL, `title` varchar(200) DEFAULT NULL, `url` varchar(200) DEFAULT NULL, `image_path` varchar(500) DEFAULT NULL, `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `modified_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `deleted_at` datetime, `henkou_tantou_name` varchar(30) DEFAULT NULL, `edit_tantou_no` bigint unsigned DEFAULT NULL, `synced_at` datetime DEFAULT NULL, PRIMARY KEY (`system_no`,`customer_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

実行したINSERT文と結果

-- (1) 主キー「1, 33」でINSERT mysql> insert into review(system_no, customer_no, item_id) values (1, 33, '228'); Query OK, 1 row affected (0.01 sec) -- (1)のSELECT結果 mysql> select * from review; Empty set (0.00 sec) -- (2) 主キー「11, 33」でインサート mysql> insert into review(system_no, customer_no, item_id) values (11, 33, '228'); Query OK, 1 row affected (0.00 sec) -- (2) のSELECT結果 mysql> select * from review; Empty set (0.00 sec) -- (3) 主キー「1, 333」でインサート(customer_noを33から333へ変更) mysql> insert into review(system_no, customer_no, item_id) values (1, 331, '228'); Query OK, 1 row affected (0.01 sec) -- (3) のSELECT結果 mysql> select * from review; +-----------+-------------+---------+------------+-----------+-------+------+------------+---------------------+---------------------+------------+--------------------+----------------+-----------+ | system_no | customer_no | item_id | maker_name | item_name | title | url | image_path | created_at | modified_at | deleted_at | henkou_tantou_name | edit_tantou_no | synced_at | +-----------+-------------+---------+------------+-----------+-------+------+------------+---------------------+---------------------+------------+--------------------+----------------+-----------+ | 1 | 331 | 228 | NULL | NULL | NULL | NULL | NULL | 2022-06-23 10:08:13 | 2022-06-23 10:08:13 | NULL | NULL | NULL | NULL | +-----------+-------------+---------+------------+-----------+-------+------+------------+---------------------+---------------------+------------+--------------------+----------------+-----------+ 1 row in set (0.00 sec)

原因がまったくわからないため、質問させていただきました。
どこか確認する項目などございましたら、ご教示いただけますと助かります。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/06/23 02:47

複数のセッションを張ってたりしないですか?
XNXSXMXR

2022/06/23 10:18

コメントありがとうございます。 GUIのツール(dbeaver) と、SSHのコンソールはつないでおります。 ツールの接続を切断しSSHコンソールのみで操作を行ってみましたが、結果は主キー「system_no=1, customer_no=33」のときだけ保存できませんでした。
guest

回答1

0

こちらの環境ですと再現性がないですが
テーブルを作り直してもおなじ状況でしょうか?
primaryが同じ値を2度投入してエラーにならない時点で投入が失敗されているんでしょうけど・・・

たとえば敢えてトランザクションでやってみるとか?

SQL

1begin; 2insert into review(system_no, customer_no, item_id) values (1, 33, '228'); 3insert into review(system_no, customer_no, item_id) values (1, 33, '228'); 4commit;

投稿2022/06/23 01:27

yambejp

総合スコア114837

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

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

XNXSXMXR

2022/06/23 02:24

早速のご回答ありがとうございます。 テーブルを作り直しても同じ状況となります。 たしかにトランザクションを使えば、同じPrimaryでの競合でエラーとなりますが、INSERT文のみの場合は表示されるエラーもない状態です。 たとえば「review1」というテーブル名だと、トランザクション使わなくてもINSERTできます。 DB自体がこわれているのでしょうか・・・・。
yambejp

2022/06/23 02:29

トランザクションでエラーが発生するということは 投入できないわけではなさそうですね 明示的にコミットしても投入できていませんか begin; insert into review(system_no, customer_no, item_id) values (1, 33, '228'); commit;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問