MySQLの使用中に発生した問題

MySQLの使用中に発生した問題

ここでは、MySQL の使用中に発生するいくつかの問題とその解決策を示します。

sql_mode=only_full_group_by はグループ クエリ エラーを引き起こします

質問
MySQL は GROUP BY クエリを実行し、エラーを報告します。

#1 - SELECT リストの式が GROUP BY 句内になく、非集計列が含まれているため、sql_mode=only_full_group_by と互換性がありません。

解決

# 問題を解決するために正しいsql_modeを設定します # MySQLにログインします
sudo mysql -hlocalhost -uroot -p123123
SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));


MySQL設定ファイルを変更し、MySQLサービスを再起動することもできます。

# MySQL 設定ファイルを開く sudo vim /etc/mysql/conf.d/mysql.cnf
# 一番下に次の文を追加します sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# その後、再起動します。sudo service mysql restart

詳しい説明
sql_mode のデフォルト値は null です。この設定では、不正なデータの挿入など、不正な操作が許可される可能性があります。この値は本番環境では厳密モードに設定する必要があり、開発およびテストフェーズで問題を検出できるように開発およびテスト環境のデータベースも設定する必要があります。 sql_mode の一般的な値は次のとおりです。

ONLY_FULL_GROUP_BY: GROUP BY 集計操作の場合、SELECT 内の列が GROUP BY に表示されない場合は、その列が GROUP BY 句にないため、この SQL は無効です。
NO_AUTO_VALUE_ON_ZERO: この値は自動インクリメント列の挿入に影響します。デフォルトでは、0 または NULL を挿入すると、次の自動インクリメント値が生成されます。このオプションは、ユーザーが値 0 を挿入し、列が自動増分されている場合に便利です。
STRICT_TRANS_TABLES: このモードでは、トランザクション テーブルに値を挿入できない場合、現在の操作が中断され、非トランザクション テーブルには制限が課されません。
NO_ZERO_IN_DATE: 厳密モードでは、日と月がゼロになることを許可しません
NO_ZERO_DATE: この値を設定すると、MySQLデータベースはゼロ日付の挿入を許可せず、ゼロ日付を挿入すると警告ではなくエラーが発生します。
ERROR_FOR_DIVISION_BY_ZERO: INSERT または UPDATE 中にデータがゼロで除算されると、警告ではなくエラーが生成されます。このモードが指定されていない場合、値がゼロで除算されると、MySQL は NULL を返します。
NO_AUTO_CREATE_USER: GRANT による空のパスワードを持つユーザーの作成を無効にする
NO_ENGINE_SUBSTITUTION: 必要なストレージ エンジンが無効になっているか、コンパイルされていない場合はエラーをスローします。この値が設定されていない場合は、代わりにデフォルトのストレージ エンジンが使用され、例外がスローされます。
PIPES_AS_CONCAT: "||" を OR 演算子ではなく文字列連結演算子として扱います。これは Oracle データベースと同じで、文字列連結関数 Concat に似ています。
ANSI_QUOTES: ANSI_QUOTES が有効になっている場合、文字列は識別子として解釈されるため、二重引用符を使用して文字列を引用することはできません。

テーブルデータをクリア

問題: データの移行やデータの修復を実行する場合、データ テーブルをクリアまたはリセットする必要があることがよくあります。

解決

TRUNCATE TABLE table_name コマンドを使用して、データ テーブルをリセットできます。このコマンドの本質は、テーブルを削除してから再構築することです。制約のあるテーブルの場合、これは機能しません。最初に外部キー制約を無効にしてから、削除を実行する必要があります。
別の方法としては、テーブル内のすべてのデータを削除し、テーブル ID の開始値を 1 に設定する方法があります。

# 最初の解決策SELECT @@FOREIGN_KEY_CHECKS; # 単一署名の外部キー制約コマンドを表示しますSET FOREIGN_KEY_CHECKS=0; # 最初に外部キー制約を無効にしますTRUNCATE TABLE table_name; # 次にテーブルをリセットします# 2 番目の解決策が推奨されますDELETE FROM table_name; # すべてのデータを削除するには、where 条件なしでコマンドを削除しますALTER TABLE table_name AUTO_INCREMENT=1; # 増分の初期値をリセットします

MySQLはメモリを大量に消費します

サーバー メモリが 1G 以下の場合は、MySQL のデフォルト設定を変更する必要があります。そうしないと、MySQL が簡単に 400M または 800M のメモリを占有することになります。

MySQL の設定を最適化することで、メモリ使用量を削減するという目的を達成できます。設定ファイルは通常、vim の /etc/my.cnf の [[mysqld]] の下にあります。 MySQL の詳細な設定項目については、公式 Web サイトを参照してください: MySQL 公式 Web サイトの詳細設定項目。現在使用しているサーバーには、シングルコア CPU と 1G のメモリが搭載されています。

# インストルメントされたテーブルオブジェクトの最大数。ロードされるテーブルインスタンスの最大数、デフォルトは -1 適応型 performance_schema_max_table_instances = 600
# 定義キャッシュに保存できるテーブル定義の数、デフォルト -1 適応型 table_definition_cache = 400 
# すべてのスレッドで開いているテーブルの数。すべてのスレッドで開くことができるテーブルの最大数。デフォルトは 2000 です。 
テーブルオープンキャッシュ = 128 
# innodbエンジンのキャッシュサイズ。起動に失敗した場合は、innodb_buffer_pool_size = 600Mに減らしてください。 
# 共同クエリ操作に使用できるバッファサイズ(スレッド排他) join_buffer_size = 8M

設定を変更した後、設定項目を有効にするために MySQL サービスを再起動します。

現在の MySQL 構成情報は次の方法で表示できます。

# mysqlにログイン
mysql -hlocalhost -uroot -pパスワード
# すべてのグローバル設定を表示します。グローバル変数を表示します。
# グローバル設定ステータスを表示します。show global status;
# 特定の構成項目をフィルタリングします。以下は、innodb で始まる構成項目をフィルタリングします。「innodb%」のようなグローバル変数を表示します。

MySQLの一時テーブルにはエイリアスが必要です

クエリによって生成された一時テーブルの場合、後で使用されない場合でも、 as を使用してエイリアスを定義する必要があります。そうでない場合はエラーが報告されます: すべての派生テーブルには独自のエイリアスが必要です。

MySQL テーブル列名を取得する

テーブル名が table_name であると仮定すると、次の 3 つのコマンドを使用してテーブルの列名を照会できます。

DESC テーブル名;

DESCRIBE テーブル名;

人からの列を表示します。

以下もご興味があるかもしれません:
  • MySQL のヒント: PID ファイルを更新せずにサーバーが終了する問題の解決方法
  • MySQLサーバーが消えた問題の解決策
  • 中国語の文字がMysqlに挿入されると完全な疑問符に変換される問題の解決策は?
  • MySQL CPU使用率が高い問題の解決策のまとめ
  • MySQL リモート接続損失問題の解決策 (MySQL サーバーへの接続が失われました)
  • MySQL: 初期通信パケットの読み取り問題の解決
  • MySQL を起動できない場合のよくある問題の概要
  • MySQL で中国語 UTF8 の文字化けが発生する
  • Mysql の中国語文字化け問題を解決する方法 (文字化けの問題に対する完璧な解決策)
  • MySQLデータ同期におけるSlave_IO_Running:Noの問題の解決方法のまとめ
  • mysql エラー:#1062 キー 1 の重複エントリ '***′ の問題解決
  • MySQL の SELECT+UPDATE における同時更新の問題に対する解決策の共有

<<:  JavaScript デザインパターン 責任連鎖パターン

>>:  Linux のタイムドログ削除を実装する簡単な方法

推薦する

MySQL ページングの制限パラメータの簡単な例

Mysqlページングの2つのパラメータ ユーザー制限 1,2 から * を選択 1 は検索する最初の...

vue の v-for ディレクティブはリストのレンダリングを完了します

目次1. リストの走査2. Vueにおけるキーの役割3. リストフィルタリングこの記事では、Vue ...

MySQLにおける静的変数の役割の詳細な説明

MySQLにおける静的変数の役割の詳細な説明静的変数の使用 静的変数サンプルコード: 関数テスト()...

XHTML 入門チュートリアル: テーブルタグの応用

<br />テーブルは XHTML では扱いにくいタグなので、このセクションで理解するだ...

JS でシンプルな画像カルーセル効果を実現

この記事では、シンプルな画像カルーセル効果を実現するためのJSの具体的なコードを参考までに紹介します...

フォーム要素属性の読み取り専用と無効の使用の比較

1) 適用範囲:読み取り専用:input[type="text"],input[...

Nginx をベースに特定の IP への短期アクセス数を制限する

特定の期間内に特定の IP へのアクセス回数を制限する方法は、特に悪意のある DDOS 攻撃に直面し...

ウェブページのエンコードにおける GB2312、GBK、UTF-8 の違い

まず、GB2312、GBK、UTF-8 はすべて文字エンコーディングであることを理解する必要がありま...

CSSの2つの特別な値は、カスケードの継承と初期メソッドを制御するために使用されます。

カスケードを制御するために CSS の任意のプロパティに割り当てることができる特別な値が 2 つあり...

HTML 再利用テクニック

HTML の再利用は、あまり話題に上らない言葉です。今日は、この問題を次のようにまとめたいと思います...

Dockerを使用してクローンリポジトリを使用してGitイメージを構築する

概要私は 1 年以上 Docker を使用しています。最近、サービスをすばやくオーケストレーションし...

トピックページデザインの 5 つの基本スキル (Alibaba UED Shanmu)

このトピックは、2012 年後半の社内共有です。まだ記事にはなっていませんが、春節が近づいているので...

MySQL グラフィカル管理ツール Navicat のインストール手順

目次序文1. 全員にインストールパッケージを用意する2. Navicatをインストールし、Navic...

Vueプロジェクトでのトークン検証ログイン(フロントエンド部分)

この記事の例では、Vueプロジェクトでのトークン検証ログインの具体的なコードを参考までに共有していま...

Linux コマンドラインでパケットをキャプチャするために tcpdump を使用するいくつかの機能

tcpdump は、ネットワークの問題のトラブルシューティングに効果的に役立つ、柔軟で強力なパケット...