Tidb クエリ SQL レポートの実行時エラー: インデックスが範囲外 [-1] エラー

最先端

今日の午後、Tidb データベースにクエリを実行しているときに、突然エラーが報告されていることに気付きましたが、同じ SQL が問題なく実行されました。最後に、SQL モードに問題があることがわかりました。Tidb には特に強い制約があります。 group by によって返されるフィールド。

文章

解決

Tidb にクエリを実行すると、次のエラー メッセージが報告されます。

[42000][1055] SELECT リストの式 #18 は GROUP BY 句になく、GROUP BY 句の列に機能的に依存しない非集計列 'ac_accounting.l.receipt_account_no' を含みます。これは sql_mode=only_full_group_by と互換性がありません 

最初に、select * from (original sql) group by uniq_data_id を使用して、元の SQL を外側の層でラップしました。

実行後のエラーメッセージは次のようになります

 実行時エラー: インデックスが範囲外です [-1]

 クエリ情報は tidb バージョンによるものですが、バージョンをアップグレードしていません。自動アップグレードなのでしょうか? くそー。

現在の sql_mode をクエリする場合は、次の SQL を実行します。 

「sql_mode」のような変数を表示;

最初のエラー メッセージを注意深く観察すると、メッセージですでに sql_mode =only_full_group_by であることが示されていることがわかりますが、その時点ではこれに気づきませんでした。

sql_mode モードは、only_full_group_by です。これは、この SQL ステートメントと同様に、a.name によってグループから select * をクエリしていることを大まかに意味します。これは、only_full_group_by モードを満たしていません。このモードでは、group by のフィールドがフィールドと一致している必要があります。これは tidb の問題ではなく、only_full_group_by モードにおける tidb の強力な制約の結果である可能性もあります。only_full_group_by モードを閉じて、次の SQL を実行して一時的に閉じるだけで済みます。

sql_mode = ''; を設定します。

 実行後、先ほどと同じSQLを実行しますが問題ありません。

このモードを永久に閉じたい場合は、mysql の設定ファイルを変更し、設定ファイル /etc/my.cnf を見つけて [mysqld] の後に追加する必要があります。

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

また

sql_mode = ''

それを保存してmysqlに保存します。

拡張する

参考までに、SQL 92 における group by の定義は次のとおりです。

SQL-92 以前では、選択リスト、HAVING 条件、または ORDER BY リストが、GROUP BY 句で名前が指定されていない非集計列を参照するクエリは許可されません。

翻訳: SELECT、HAVING、ORDER の後の非集計フィールドは、 GROUP BY の後のフィールドとまったく同じである必要があります。

ただし、SQL99 では以下のような新しい規定が設けられたため、mysql の SQL ステートメントでクエリされるフィールドが group by のフィールドと一致しないことがよくあります。

SQL:1999 以降では、機能的に GROUP BY 列に依存している場合、オプション機能 T301 に従ってそのような非集計が許可されます。名前と custid の間にそのような関係が存在する場合、クエリは正当です。これは、たとえば、顧客の主キーが管理されている場合に当てはまります。

翻訳: group by の後のフィールドが主キーであり、非集計フィールドが group by の後のフィールドに依存する場合、これらの非集計フィールドを SELECT、HAVING、ORDER BY ステートメントの後に置くことができます。

ただし、この時点で主役の ONLY_FULL_GROUP_BY が登場しました。このモードの意味は、SQL 92 の group by の制限と似ています。
 

おすすめ

転載: blog.csdn.net/zanpengfei/article/details/125876124