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

推薦する

MySql インデックスの詳細な紹介と正しい使用方法

MySql インデックスの詳細な紹介と正しい使用方法1. はじめに:インデックスはクエリ速度に重大な...

Win7 での Mysql 5.7.17 winx64 インストール チュートリアル

ソフトウェア バージョンとプラットフォーム: MySQL-5.7.17-winx64、win7 Ho...

element.style インライン スタイルを変更する方法のチュートリアル

序文上記の Web ページ スタイルを記述しているときに、スタイルの値をどのように変更しても、ページ...

JavaScriptプロトタイプチェーン図のまとめと実践

目次プロトタイプチェーンプロトタイプチェーンに基づいてシンプルなJQueryライブラリを実装すること...

docker で Apollo をデプロイする詳細なチュートリアル

1. はじめにここでは apollo について詳しく説明しません。公式サイト https://git...

JSはストップウォッチタイマーを実装します

この記事の例では、ストップウォッチタイマーを実装するためのJSの具体的なコードを参考までに共有してい...

MySql 8.0.16-win64 インストール チュートリアル

1. ダウンロードしたファイルを以下のように解凍します。 。 2. 環境変数に解凍ディレクトリを追加...

mysqldump を使用して MySQL データをバックアップする方法

1. mysqldump の紹介mysqldump は、MySQL に付属する論理バックアップ ツー...

Linuxファイルコマンドの使用

1. コマンドの紹介ファイル コマンドは、ファイルの種類を識別するために使用されます。ファイル チェ...

Linuxのbasenameコマンドの使い方

01. コマンドの概要basename - ファイル名からディレクトリとサフィックスを削除しますba...

divとspanの違いと使い方

目次1. DIVとSPANの違いと特徴2. スパンタグの概要3. 拡大と改善4. 凡例の効果の実証例...

フロントエンドインタビューに必要なホモロジーとクロスドメインの詳細な説明

序文ご存知のとおり、ブラウザの相同性戦略とクロスドメイン方式も、フロントエンド面接で頻繁に遭遇する問...

Linux システムによって報告される tcp_mark_head_lost エラーの処理方法

問題の説明最近、ホストから次のカーネル情報が報告されました。 7月8日 10:47:42 cztes...

MySQL 全体または単一のテーブルデータのエクスポート

単一のテーブルをエクスポートするmysqldump -u ユーザー -p db名 テーブル名 >...

favicon.ico についていくつか注意点があります (ルートディレクトリに置くのがベストです)

任意のウェブページを開きます。例: http://www.baidu.com/ ブラウザのタブのヘッ...