MySQL に配列を保存するサンプルコードと方法

MySQL に配列を保存するサンプルコードと方法

多くの場合、ストアド プロシージャを作成するときに配列がよく使用されますが、MySQL ではストアド プロシージャに配列を直接渡す方法はありません。この場合、パラメータを文字列の形式で渡す方法をフォールバックまたは変更し、プロシージャ本体で文字列を配列に変換することしかできないのでしょうか?しかし、残念ながら、MySQL では文字列を配列に変換する関数を直接提供していません。今、誰かを殴りたい気分ですか?しかし、慌てる必要はありません。この道が塞がれても、別の道を選ぶことができます。必ず解決策はあります。受信した文字列を複数の文字に切り捨てて一時テーブルに渡し、カーソルを使用するか、テーブルを直接結合してデータをフィルタリングすることができます。これにより、後で望ましい効果が得られます。

これを実践するために例を見てみましょう。

1. インスタンスのデータベースを作成します。

データベース huafeng_db を作成します。

 

huafeng_db を使用します。

 

`huafeng_db`.`t_scores` が存在する場合はテーブルを削除します。

`huafeng_db`.`t_students` が存在する場合はテーブルを削除します。

`huafeng_db`.`t_class` が存在する場合はテーブルを削除します。

 

CREATE TABLE `huafeng_db`.`t_class` ( `class_id` int(11) NOT NULL, `class_name` varchar(32) CHARACTER SET utf8 DEFAULT NULL,

 主キー (`class_id`)

)ENGINE=InnoDB デフォルト文字セット=utf8;

 

`huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('1', 'First Grade') を挿入します。

`huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('2', '2年生') を挿入します。

`huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('3', 'Grade Three') を挿入します。

`huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('4', '4年生') を挿入します。

`huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('5', '5年生') を挿入します。

`huafeng_db`.`t_class` (`class_id`, `class_name`) に VALUES ('6', 'Grade 6') を挿入します。

 

CREATE TABLE `t_students` ( `student_id` int(11) NOT NULL AUTO_INCREMENT、 `student_name` varchar(32) NOT NULL、 `sex` int(1) DEFAULT NULL、 `seq_no` int(11) DEFAULT NULL、 `class_id` int(11) NOT NULL、

 主キー (`student_id`)、

 キー `class_id` (`class_id`),

 制約 `t_students_ibfk_1` 外部キー (`class_id`) 参照 `t_class` (`class_id`)

)ENGINE=InnoDB デフォルト文字セット=utf8;

 

`huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) に VALUES('Xiaohong',0,1,'1') を挿入します。

`huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) に VALUES('Xiaoqing',0,2,'2') を挿入します。

`huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) に VALUES('Xiao Ming',1,3,'3') を挿入します。

`huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) に VALUES('Xiao Lan',0,4,'4') を挿入します。

`huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) に INSERT INTO VALUES('小米',1,5,'5');

`huafeng_db`.`t_students`(`student_name`,`sex`,`seq_no`,`class_id`) に VALUES('小白',1,6,'6') を挿入します。

 

CREATE TABLE `huafeng_db`.`t_scores` ( `score_id` int(11) NOT NULL AUTO_INCREMENT, `course_name` varchar(64) DEFAULT NULL, `score` double(3,2) DEFAULT NULL, `student_id` int(11) DEFAULT NULL,

 主キー (`score_id`)、

 キー `student_id` (`student_id`),

 制約 `t_scores_ibfk_1` 外部キー (`student_id`) 参照 `t_students` (`student_id`)

) ENGINE=InnoDB AUTO_INCREMENT=3 デフォルト CHARSET=utf8;

 

`t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('1', 'Chinese', '90', '1') を挿入します。

`t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('2', '数学', '97', '1') を挿入します。

`t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('3', 'English', '95', '1') を挿入します。

`t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('4', 'Chinese', '92', '2') を挿入します。

`t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('5', '数学', '100', '2') を挿入します。

`t_scores` (`score_id`, `course_name`, `score`, `student_id`) に VALUES ('6', 'English', '98', '2') を挿入します。

2. 要件: 学生IDに従って学生情報を一括削除する

`p_del_studentInfo_bySeqNo` が存在する場合はプロシージャを削除します。

区切り文字 $$

CREATE PROCEDURE p_del_studentInfo_bySeqNo(IN arrayStr VARCHAR(1000),IN sSplit VARCHAR(10))

SQL SECURITY INVOKER #他のユーザーが実行できるようにする BEGIN DECLARE e_code INT DEFAULT 0; #エラーコードを0に初期化する

  DECLARE result VARCHAR(256) CHARACTER set utf8; #中国語の文字化け問題を解決するために返された結果を初期化します DECLARE arrLength INT DEFAULT 0; /*配列の長さを定義します*/

  DECLARE arrString VARCHAR(1000);/*配列の初期文字を定義します*/

  DECLARE sStr VARCHAR(1000);/*最初の文字を定義する*/

  DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET e_code=1;#エラー発生後も実行を続行します。(実行結果を返す必要がある場合に使用します)

 

 

  START TRANSACTION;#トランザクションの開始 SET arrLength = LENGTH(arrayStr) - LENGTH(REPLACE(arrayStr,sSplit,''));/*配列の長さを取得*/

  SET arrString = arrayStr;

  存在する場合は一時テーブルを削除します list_tmp;

  一時テーブルを作成する list_tmp(id VARCHAR(32));/*一時テーブルを定義する*/

 

  arrLength > 0 の場合

   set sStr = substr(arrString,1,instr(arrString,sSplit)-1); -- 区切り文字の前の文字列を取得します。 set arrString = substr(arrString,length(sStr)+length(sSplit)+1); -- 区切り文字の後の文字列を取得します。 set arrLength = arrLength -1;

   @str を trim(sStr) に設定します。

   list_tmp(id) に values(@str) を挿入します。

   END WHILE; row_count()=0の場合 

    e_code = 1 を設定します。 

    SET結果 = '正しいパラメータを入力してください'; 

   終了の場合;

 

  @count = (SELECT count(1) FROM t_students s,list_tmp t WHERE s.seq_no = t.id); を設定 @count > 0 THEN

    t_scores から student_id を削除します (SELECT s.student_id FROM t_students s,list_tmp t WHERE s.seq_no = t.id);

    t_students から削除 WHERE student_id in (SELECT t.id FROM list_tmp t); ELSE

     e_code = 1 を設定します。

     SET結果 = '生徒が存在しません! ';

  END IF; e_code=1の場合

    ROLLBACK; #ロールバックELSE

    専念;

    SET result = '生徒は正常に削除されました';

  終了の場合;

  結果を選択します。

  存在する場合は一時テーブルを削除します list_tmp;

終了 $$

区切り文字 ;

注: ストアド プロシージャを作成するときに、2 つのパラメーターが渡されます。最初のパラメーターは渡される配列文字列の形式を表し、2 番目のパラメーターは文字列を分割する方法です。

変数を宣言して初期化する

DECLARE arrLength INT DEFAULT 0;/*配列の長さを定義する*/

DECLARE arrString VARCHAR(1000);/*配列の初期文字を定義します*/

DECLARE sStr VARCHAR(1000);/*最初の文字を定義する*/

入力パラメータ配列の長さを取得する

SET arrLength = LENGTH(arrayStr) - LENGTH(REPLACE(arrayStr,sSplit,''));/*配列の長さを取得します*/

SET arrString = arrayStr;/*代入*/

一時テーブルの作成

存在する場合は一時テーブルを削除します list_tmp;

一時テーブルを作成する list_tmp(id VARCHAR(32));/*一時テーブルを定義する*/

配列文字列をインターセプトし、後続のビジネス使用のために一時テーブルに保存します。

arrLength > 0 の場合

 set sStr = substr(arrString,1,instr(arrString,sSplit)-1); -- 区切り文字の前の文字列を取得します。 set arrString = substr(arrString,length(sStr)+length(sSplit)+1); -- 区切り文字の後の文字列を取得します。 set arrLength = arrLength -1;

 @str を trim(sStr) に設定します。

 list_tmp(id) に values(@str) を挿入します。

終了しながら;

注意: ストアドプロシージャの最後には必ず一時テーブルを削除してください。

それほど複雑でないビジネスでは、ストアド プロシージャを使用する必要はありません。この記事は、すべての人にストアド プロシージャの使用法を教えるものではなく、ストアド プロシージャが存在することをすべての人に知ってもらうためのものです。

以下もご興味があるかもしれません:
  • Mysqlはストアドプロシージャを通じて文字列を配列に分割します
  • PHP を使用して MySQL の重複 ID 2 次元配列を 3 次元配列に再編成する方法
  • PHPがMySQLクエリの結果を配列に変換し、それを連結する例
  • PHP で MySQL データベースをクエリし、結果を配列に保存する方法
  • mysql_fetch_row() を使用してクエリ結果を配列として返す方法の詳細な理解
  • PHPでは、mysql_fetch_assocによって返された配列の処理にforeach--echoは必要ありません。

<<:  Vue 画像切り抜きコンポーネントのサンプルコード

>>:  WindowsシステムでPhPStudy MySQLの起動に失敗する問題を解決する

推薦する

オペレーターが知っておくべき 18 個の Nginx プロキシ キャッシュ構成のヒント (どれを知っていますか?)

アプリケーションや Web サイトのパフォーマンスが成功の重要な要素であることは誰もが知っています。...

Linux システムで時間を取得して使用する方法

Linux システム時間には 2 種類あります。 (1)暦上の時刻。値は、指定された時刻、1970 ...

RocketMQ の Docker インストールとインストール中に発生した問題の解決策

目次rocketmqイメージを取得する名前rvを作成する単一のブローカーノードを作成するrocket...

IDEAでVUEプロジェクトをデバッグするための詳細な手順

js コードをデバッグするには、コード内にデバッガーを記述するか、Chrome で毎回ブレークポイン...

vue3で注意すべき2つのポイントを詳しく解説:セットアップ

目次vue2の場合vue3ではセットアップに関する注意事項セットアップライフサイクルは、before...

MySQL データ アーカイブ ツール mysql_archiver の詳細な説明

目次I. 概要2. pt-archiverの主なパラメータ3. mysql_archiverのインス...

MySQL トリガーの使用シナリオとメソッドの例

トリガー:トリガーの使用シナリオと対応するバージョン:トリガーは次の MySQL バージョンで使用で...

Vue における v-for のキーの一意性の詳細な説明

目次1. DOM の違い2. 同じレイヤーの同じタイプの要素にキー属性を追加する3. キーはインデッ...

JavaScript 配列の Reduce() メソッドの構文と例の分析

序文Reduce() メソッドは関数を累積器として受け取り、配列内の各値 (左から右へ) が単一の値...

Linux で Grafana をインストールし、InfluxDB モニタリングを追加する方法

Grafana をインストールします。公式 Web サイトでは、直接インストールできる Ubuntu...

MySQLリモート接続失敗の解決策

以前、MySQLがローカルでは接続できるのにリモートでは接続できないという問題に遭遇したことがありま...

2018 年にリリースされる Apache Spark 2.4 の新機能は何ですか?

この記事は、2018 年 9 月 19 日に Adob​​e Systems Inc で開催された ...

Linux環境でタイムゾーンを設定できない問題を解決

Linuxでタイムゾーンを変更する場合、常に変更することはできませんAsia/Shanghai に変...

2 つの Linux サーバー間の自動ファイル同期

サーバーB(172.17.166.11)の電源がオンまたは再起動されると、サーバーA(172.17....

ウェブページのカラーマッチングスキルについての簡単な説明(フロントエンド開発者必読)

一般的に、Web ページの背景色は、より柔らかく、よりシンプルで、より明るく、暗いテキストとマッチし...