序文最近、sql_mode の話題については何度も話し合われ、関連する問題にも何度も遭遇しました。今日は、鉄は熱いうちに打て、sql_mode の別のケーススタディを皆さんと共有したいと思います。 シナリオシミュレーションビジネス上の機密性を考慮し、以下に含まれるテーブルとストアド プロシージャは実際のデータではありませんが、トラブルシューティング プロセスには影響しません。 (1)クライアント開発者は、標準のグループ化構文に厳密に従わないストアドプロシージャを作成しました。 セッション 1: mysql> 区切り文字 // mysql> プロシージャ test_for_group_by() を作成します -> 開始 -> test.test から k、pad、count(*) を選択し、k でグループ化します。 -> 終了 // クエリは正常、影響を受けた行は 0 行 (0.01 秒) mysql> 区切り文字; (2) クライアント開発者はストアドプロシージャを呼び出し、ERROR 1140を報告します。ストアドプロシージャは複雑で変更が困難であったため、クライアントはsql_modeを変更することを選択します。 セッション 1: mysql> test_for_group_by() を呼び出します。 エラー 1140 (42000): GROUP BY のない集計クエリで、SELECT リストの式 #1 に非集計列 'test.test.k' が含まれています。これは sql_mode=only_full_group_by と互換性がありません。 (3)クライアントがsql_modeを変更して再度実行しても、ERROR 1140が報告される。 セッション2: mysql> グローバル sql_mode を 'STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION' に設定します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) セッション 1: mysql> test_for_group_by() を呼び出します。 エラー 1140 (42000): GROUP BY のない集計クエリで、SELECT リストの式 #1 に非集計列 'test.test.k' が含まれています。これは sql_mode=only_full_group_by と互換性がありません。 (4)この時点で、システム変数の変更は新しい接続にのみ有効であり、既存の接続には有効ではないことに気付きました。そこで、クライアントに再接続してシステム変数が有効になっていることを確認し、ストアドプロシージャを再度呼び出すように依頼しましたが、エラーメッセージ ERROR 1140 がまだ表示されていました。何度か試してみましたが、結果は同じでした。 セッション3: mysql> 'sql_mode' のような変数を表示します。 +---------------+------------------------------------------------------------------------------------------------------------------------------+ | 変数名 | 値 | +---------------+------------------------------------------------------------------------------------------------------------------------------+ | sql_mode | STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION | +---------------+------------------------------------------------------------------------------------------------------------------------------+ セット内の1行(0.01秒) mysql> test_for_group_by() を呼び出します。 エラー 1140 (42000): GROUP BY のない集計クエリで、SELECT リストの式 #1 に非集計列 'test.test.k' が含まれています。これは sql_mode=only_full_group_by と互換性がありません。 (5)さらに調査を進め、クライアントにセッション内で非標準のgroup by文を実行するように依頼したところ、文は正常に実行できることが判明した。 セッション3: mysql> select user,host,count(*) mysql.user グループから user を選択; +---------------+-----------+----------+ | ユーザー | ホスト | カウント(*) | +---------------+-----------+----------+ | mysql.セッション | ローカルホスト | 1 | | mysql.sys | ローカルホスト | 1 | | ルート | ローカルホスト | 1 | | rpl_user | % | 1 | | テスト | % | 1 | +---------------+-----------+----------+ セット内の行数は 5 です (0.00 秒) (6)調査を続けると、ストアドプロシージャのsql_modeにまだONLY_FULL_GROUP_BYが含まれているため、実行時にエラーが報告されました。 セッション2: mysql> ルーチンから、routine_catalog、routine_schema、routine_name、routine_type、created、last_altered、sql_mode を選択します。ここで、routine_name は 'test_for_group_by' です。 +-----------------+----------------+-------------------+--------------+---------------------+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------+ | ルーチンカタログ | ルーチンスキーマ | ルーチン名 | ルーチンタイプ | 作成済み | 最終変更日 | sql_mode | +-----------------+----------------+-------------------+--------------+---------------------+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------+ | def | test | test_for_group_by | 手順 | 2020-12-24 12:12:10 | 2020-12-24 12:12:10 | ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION | +-----------------+----------------+-------------------+--------------+---------------------+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------+ セット内の 1 行 (0.00 秒) (7)ここで、システム変数の変更は新しく作成されたオブジェクトにのみ有効であり、既存のオブジェクトには有効ではないこともわかります。解決策は非常に簡単で、ストアドプロシージャを再構築するだけです。 セッション3: mysql> プロシージャ test_for_group_by を削除します。 クエリは正常、影響を受けた行は 0 行 (0.01 秒) mysql> 区切り文字 // mysql> プロシージャ test_for_group_by() を作成します -> 開始 -> test.test から k、pad、count(*) を選択し、k でグループ化します。 -> 終了 // クエリは正常、影響を受けた行は 0 行 (0.01 秒) mysql> 区切り文字; mysql> test_for_group_by() を呼び出します。 +--------+-------------------------------------------------------------+----------+ | k | パッド | カウント(*) | +--------+-------------------------------------------------------------+----------+ | 393975 | 35227182905-15234265621-59793845249-15413569710-23749555118 | 1 | | 495688 | 09512147864-77936258834-40901700703-13541171421-15205431759 | 1 | | 497896 | 13152283289-69561545685-52868757241-04245213425-69280254356 | 1 | | 498573 | 43131080328-59298106536-35954612339-97546855884-75769514803 | 1 | | 500775 | 27590239742-20204899609-34345212327-79811525340-24267764271 | 1 | | 501885 | 63188288836-92351140030-06390587585-66802097351-49282961843 | 1 | | 503330 | 01495266405-82925129145-92643983850-90243995398-18709399387 | 1 | | 503666 | 40929980986-33813039690-13155419391-97985458477-39771362212 | 1 | | 504353 | 00505722282-72931248925-57037623248-81117963809-88658076981 | 1 | | 514246 | 21979564480-87492594656-60524686334-78820761788-57684966682 | 1 | +--------+-------------------------------------------------------------+----------+ セット内の行数は 10 です (0.00 秒) クエリは正常、影響を受けた行は 0 行 (0.00 秒) 要約するこの事例から、sql_mode システム変数の変更は、新しく作成された接続と新しく作成されたオブジェクト (主に関数とストアド プロシージャを含む) に対してのみ有効であり、既存の接続と既存のオブジェクトに対しては有効ではないことがわかります。 上記は、MySQL sql_mode の変更が有効にならない理由と解決策の詳細な内容です。MySQL sql_mode の変更が有効にならないことの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: CSS に基づいて MaterialUI ボタンクリックアニメーションを実装し、それを React コンポーネントにカプセル化します。
MySQL には読み取りと書き込みを分離するアーキテクチャが多数あります。Baidu のそれらのほと...
なぜこのような効果を実現するのでしょうか。実は、この効果もタイトルプロンプトから派生したものですが、...
この記事の例では、画像のドラッグと並べ替えを実装するためのVueの具体的なコードを参考までに共有して...
centos-DVD1バージョンシステムの固定IPアドレスは192.168.159.128で、cen...
以下のように表示されます。上記のように、置き換えるだけです。 Python3.6-MySql でファ...
序文私たちのビジネスがまだ初期段階にあり、同時実行の度合いが比較的低い場合、数年間はデッドロックの問...
コードをコピーコードは次のとおりです。 <HTML> <ヘッド> <T...
Web デザインは科学であると同時に芸術でもあります。 Web デザイン作業は、半分は適切なプログラ...
序文最近、4 年間実行されている Java EE Web プロジェクトでは、システムが開けないという...
プロキシを有効にする2つの方法React には、直接使用できるカプセル化された Ajax リクエスト...
Web アプリケーションが 1 台のマシンでのみ実行される場合、パフォーマンスを向上させるのは非常に...
Tomcat は、Java Community Process を通じて Sun が開発した、広く使...
Nginx (エンジン x) は、IMAP/POP3/SMTP サービスも提供する高性能 HTTP ...
目次1. Vue環境を構築する2. Vue スキャフォールディングツール3. プロジェクトを作成する...
目次1. キーワード2. 脱構築3. 文字列4. 正規化5. 配列6. 機能7. オブジェクト8.シ...