MySQL でストアド プロシージャを作成し、データ テーブルに新しいフィールドを追加する方法の分析

MySQL でストアド プロシージャを作成し、データ テーブルに新しいフィールドを追加する方法の分析

この記事では、例を使用して、MySQL でストアド プロシージャを作成し、データ テーブルに新しいフィールドを追加する方法について説明します。ご参考までに、詳細は以下の通りです。

必要:

データベースのテーブルに新しいフィールドを追加します (フィールドが既に存在する場合は何も実行されません。フィールドが存在しない場合は新しいフィールドが追加されます)

長い間Baiduを検索しましたが、要件を満たす例はありませんでした。参照して自分で理解するしかありませんでした。ついに、私はそれを理解しました。以下はいくつかのバージョンの変更点です。

初版:

区切り文字 $$
CREATE PROCEDURE insert_column()
始める
存在しない場合(information_schema.columnsから1を選択)
table_schema='ltivalley' かつ table_name='t_luck' の場合
かつ、column_name='sss' ) の場合
テーブル ltivalley.t_luck を変更し、 sss varchar(255) を Null 以外に追加します。
終了の場合;
終わり
$$
区切り文字 ;

このストアド プロシージャは、ltivalley データベースの t_luck テーブルに新しい sss フィールドを追加できますが、デッドコードされており柔軟性がないため、役に立ちません。

第2版​​:

区切り文字 $$
CREATE PROCEDURE insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
@sql_1 を concat("存在しない場合は(SELECT 1 FROM
information_schema.columns WHERE table_schema=",dbname,"
AND テーブル名=",tbname," AND 列名=",colname,")
それから
テーブル ",dbname,".",tbname," を変更し、",colname," を追加します。
varchar(255) は null ではありません。
終了if;");
@sql_1 からステートメントを準備します。
ステートメントの実行;
DEALLOCATE PREPARE ステートメント;
終わり
$$
区切り文字 ;

ストアド プロシージャの作成には問題はありませんが、呼び出し時にエラーが発生し、「IF」の前後でエラーが報告されます。これは、MySQL では、IF はストアド プロシージャ内にしか存在できないためです。ここで EXECUTE stmt を使用して実行すると、ストアド プロシージャ内の if ステートメントを実行しないのと同じになるため、エラーが報告され、実行できません。だから無駄だよ!

第3版

区切り文字 $$
CREATE PROCEDURE insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
始める
SET @selec=CONCAT('SELECT 1 FROM information_schema.columns WHERE table_schema="',dbname,'" AND table_name="',tbname,'" AND column_name="',colname,'"');
@selec から selec を準備します。
SET @addcol=CONCAT('ALTER TABLE ',dbname,'.',tbname,' ADD ',colname,' VARCHAR(255)');
addcol を @addcol から準備します。
存在しない場合(選択を実行)
addcol を実行します。
終了の場合;
終わり
$$
区切り文字 ;

不明な理由により、EXECUTE 選択ステートメントを IF NOT EXISTS() で実行できないため、ストアド プロシージャを作成できません。だから無駄だよ!

アルティメットエディション

insert_column が存在する場合はプロシージャを削除します。
区切り文字 $$
CREATE PROCEDURE insert_column(in dbname varchar(255),in tbname varchar(255),in colname varchar(255))
始める
@iscolexists = 0 に設定します。
SET @selec=CONCAT('SELECT count(*) into @iscolexists FROM information_schema.columns WHERE table_schema="',dbname,'" AND table_name="',tbname,'" AND column_name="',colname,'"');
@selec から selec を準備します。
選択を実行してください。
DEALLOCATE PREPARE を選択します。
SET @addcol=CONCAT('ALTER TABLE ',dbname,'.',tbname,' ADD ',colname,' VARCHAR(255)');
addcol を @addcol から準備します。
IF(@iscolexists=0)の場合
addcol を実行します。
終了の場合;
終わり
$$
区切り文字 ;

最終結果については、まずEXECUTE selecを実行し、その結果を変数@iscolexistsに格納します。次に、 IF()@iscolexistsの値を判断し、対応する操作を実行します。利用可能!

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL ストアド プロシージャ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQLでデータテーブルを作成するときにエンジンMyISAM/InnoDBを設定する
  • MySQL でデータ テーブルを作成し、主キーと外部キーの関係を確立する方法の詳細な説明
  • MySQL のデータベースとデータ テーブルのエンコード形式を表示、作成、変更します。
  • MySQLでテーブルを作成および削除するための詳細な手順と構文
  • Mysqlでデータテーブルインスタンスコードを作成する
  • MySQL で 800 万エントリのテスト データ テーブルをすばやく作成する方法

<<:  SSH経由でリモートLinuxシステムでコマンドを実行する方法

>>:  Node.js でのクラスター作成に関する簡単な説明

推薦する

CentOS で yum を使用して rabbitmq-server をインストールする方法

RabbitMQをインストールする前にSocatをインストールする必要があります。そうしないと、Ra...

Windows 10 での MySQL 8.0.12 解凍バージョンのインストール グラフィック チュートリアル

この記事は、MySQL 8.0.12解凍版のインストールグラフィックチュートリアルを記録しています。...

HTML でよく使われるメタ百科事典 (推奨)

メタタグは、HTML言語のヘッド領域にある補助タグです。HTML文書のヘッダーにあるヘッドタグとタイ...

Linux でファイルの種類を理解して識別する方法

序文ご存知のとおり、Linux ではハードディスクやグラフィック カードなどすべてがファイルです。 ...

Linuxプロセス監視と自動再起動の簡単な実装方法

目的: Linux では、さまざまな理由でサーバー プログラムがダンプされ、ユーザーの使用に影響する...

uniappのグローバル変数実装の詳細な説明

序文この記事では、uniapp グローバル変数の実装方法をいくつかまとめています。詳細な知識は、uV...

JavaScript配列の重複排除のいくつかの方法についての詳細な説明

目次1.重複排除を設定する2. 重複を削除するには、2 回の for ループを使用します。 3. i...

Linuxのwatchコマンドの使用

1. コマンドの紹介watch コマンドは、指定されたコマンドを定期的に実行し、実行結果を全画面に表...

Win10 の組み込み Linux システムを使用して Spring Boot プロジェクトを開始する方法

1. Windows10の組み込みLinuxサブシステムをインストールする1.1. Linuxサブシ...

MySQL のロックに関する問題

ロックの分類:データ操作の粒度から:テーブルロック:操作時にテーブル全体がロックされます。行ロック:...

MySQL における楽観的ロックと悲観的ロックの例

データベース管理システムにおける同時実行制御のタスクは、データベース内の同じデータに同時にアクセスす...

泡の小さな鋭角効果を実現するCSS

効果画像(境界線の色が薄すぎるので、{} で囲みます): { }参考リンク Pure CSS バブル...

Linux DockerでSpringbootプロジェクトを実行するための詳細な手順

導入: springboot プロジェクトを実行する Docker の構成は実は非常にシンプルで、L...

Python3.6-MySql 挿入ファイルパス、バックスラッシュをなくす解決策

以下のように表示されます。上記のように、置き換えるだけです。 Python3.6-MySql でファ...

MySQLトリガーの使用例の詳細

MySQL トリガー構文の詳細: トリガーは、特定のテーブル内のデータが挿入、削除、または更新される...