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 でのクラスター作成に関する簡単な説明

推薦する

1つの記事でJSONPの原理と応用を理解する

目次JSONPとはJSONP 原則JSONP実装1. Ajaxでクロスドメインリクエストが行われると...

ウェブサイトのビジュアルデザインの重要なポイント

手工芸デザインからグラフィックデザイン、そしてウェブデザインまで、デザインの原則は同じままですが、私...

写真とテキストによる MySQL 8.0.21 インストール チュートリアル

1. ダウンロードリンクをダウンロードするダウンロードをクリックします。Oracle アカウントにロ...

Win10 への MySQL 5.7 のインストール MSI 版のチュートリアル(画像とテキスト付き)

主にインストール後に my.ini ファイルを確認するために、msi 形式でインストールしました。フ...

Linux での MongoDB のインストールに関するチュートリアル

MongoDB はクロスプラットフォームであり、Windows と Linux の両方にインストール...

Dockerコンテナの構築と実行のプロセスの詳細な説明

イメージをプルし、コンテナを作成してコンテナを実行するだけです。 docker run -d --r...

初心者のためのウェブサイト構築入門 - ウェブサイト構築に必要な条件とツール

今日は、初心者の次のような質問に答えます。学ぶ勇気さえあれば、自分のウェブサイトを構築するのは簡単で...

2つのウェブサイトページ翻訳プラグインの共有

TranslateThis URL: http://translateth.is Google 翻訳...

MySQL サービスに iptables ファイアウォール ポリシーを追加するためのソリューション

MySQL データベースが Centos7 システムにインストールされており、オペレーティング シス...

MySQLデータベースに他のIPアドレスからアクセスできない問題の解決策

序文先ほどのプロジェクトを参考にすると、環境は整いました。プロジェクトの準備と検証の段階で、問題が発...

Vue で手ぶれ補正を実装するためのサンプルコード

手ぶれ防止: 繰り返しのクリックによるイベントのトリガーを防止まず、揺れとは何でしょうか? 震えるの...

Linux で nginx を起動および再起動する方法

Nginx (エンジン x) は、IMAP/POP3/SMTP サービスも提供する高性能 HTTP ...

div 要素に終了タグがないため、Web ページを開くことができません

最初は速度の問題だと思ったので、その後、すべての画像リンク リクエストをクロスサイト接続ではなくサイ...

CentOS 7 で MySQL 8 の複数のインスタンスを設定する詳細なチュートリアル (必要な数だけ設定できます)

原因最近、プロジェクトのリファクタリングを始めたのですが、マスタースレーブと読み取り書き込み分離を使...

CSS は、小さな鋭角のチャット ダイアログ ボックスで鋭角の吹き出し効果を実現します。

1. CSS を使用して、小さな尖った角のチャット ダイアログ ボックスと尖った角の吹き出しを描画...