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の起動に失敗する問題を解決する

推薦する

配列をフラット化する 5 つの JavaScript の方法

目次1. 配列の平坦化の概念2. 実装1. 減らす2. toString と split 3. 結合...

Dockerコンテナを介してランプアーキテクチャを構築するプロセス

目次1. Centosイメージを取得する2. nginxイメージをビルドする3. MySQLイメージ...

ラムダ式の原則と例

ラムダ式ラムダ式 (クロージャとも呼ばれる) は、Java 8 のリリースを推進した最も重要な新機能...

JSの高階関数5つを共有する

目次1. はじめに2. 再帰3. コールバック関数3.1 匿名コールバック関数3.2 パラメータ付き...

仮想マシンを作成し、VMware に Redhat Linux オペレーティング システムをインストールする (グラフィック チュートリアル)

VMware で仮想マシンを作成し、Redhat Linux オペレーティング システムをインスト...

nginxのデフォルトポートを変更する方法の詳細な説明

まず設定ファイルがどこにあるか調べる nginx.confはどこにありますかこれらのディレクトリを調...

Vue でインデックスをキー属性値として使用することが推奨されないのはなぜですか?

目次序文キーの役割差分アルゴリズムにおけるキーの役割ヘッドノードを同期するテールノードを同期する新し...

GIFアニメーション効果を模倣した自動ビデオ再生を実現するWeChatアプレットの例

需要背景:ミニプログラムページに GIF ダイナミック画像を挿入しますが、GIF 画像は通常サイズが...

面接官がmysqlのcharとvarcharの違いを尋ねたとき

目次charとvarcharの違いcharとvarcharの違い上記は、MySQL における cha...

MySQL 外部キー設定方法の例

1. 外部キーの設定方法1. MySQL では、2 つのテーブルを関連付けるために、外部キー (FO...

複数のdiv内のテーブルのtdwidth設定は同じで、揃えることができません

最近、複数のdivにあるテーブルのTDを同じ幅に調整しても、揃えることができず、幅にパターンがないこ...

ファイアウォールルールの設定とコマンド(ホワイトリスト設定)の詳しい説明

1. ファイアウォールルールを設定する例1: ポート8080を外部に公開する ファイアウォールコマン...

MySQL 5.7 の同時レプリケーションにおける暗黙のバグの分析

序文当社の MySQL オンライン環境のほとんどはバージョン 5.7.18 を使用しています。このバ...

CSS 透明ボーダー背景クリップマジック

この記事では、CSSの透明な境界線の背景クリップの素晴らしい使い方を主に紹介し、みんなと共有し、自分...