MySQL使用存儲過程實現判斷表中字段或者索引是否存在,如果不存在則創建


使用存儲過程可以保證數據庫升級腳本可以重復執行而不會報錯。

CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL COMMENT '非自增id',
  `account` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `account_pinyin` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'account的拼音,用於account排序。',
  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  `salt` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '鹽值',
  `mobile` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '手機號,不可為null,默認值為'''',可用於登錄',
  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '郵箱,不可為null,默認值為'''',可用於登錄',
  `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '用戶是否刪除。0:未刪除;1:刪除',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_account` (`account`),
  UNIQUE KEY `unique_mobile` (`mobile`),
  UNIQUE KEY `unique_email` (`email`),
  KEY `index_updated_at` (`updated_at`),
  KEY `index_account_pinyin` (`account_pinyin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

1、存儲過程判斷索引是否存在

-- 判斷索引是否存在,不存在則創建索引
DROP PROCEDURE IF EXISTS add_index;  
DELIMITER //
CREATE PROCEDURE add_index() BEGIN 
DECLARE  target_database VARCHAR(100);
DECLARE  target_table_name VARCHAR(100);
DECLARE  target_column_name VARCHAR(100);
DECLARE  target_index_name VARCHAR(100);
set target_table_name = 'tb_user';
set target_column_name = 'account_pinyin';
set target_index_name = 'index_account_pinyin';
SELECT DATABASE() INTO target_database;
IF NOT EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema = target_database AND table_name = target_table_name AND index_name = target_index_name) THEN
    set @statement = CONCAT("ALTER TABLE ", target_table_name, " ADD INDEX ", target_index_name, "(", target_column_name, " ASC )");
    PREPARE STMT FROM @statement;
    EXECUTE STMT;
END IF;
END
//
DELIMITER ;   -- 注意 DELIMITER 與分號之間有空格
CALL add_index();

 

2、存儲過程判斷字段是否存在

-- 判斷字段是否存在,不存在則增加
DROP PROCEDURE IF EXISTS add_column;
DELIMITER //
CREATE PROCEDURE add_column() BEGIN
DECLARE  target_database VARCHAR(100);
DECLARE  target_table_name VARCHAR(100);
DECLARE  target_column_name VARCHAR(100);
DECLARE  target_index_name VARCHAR(100);
set target_table_name = 'tb_user';
set target_column_name = 'new_column';
SELECT DATABASE() INTO target_database;
IF NOT EXISTS (SELECT * FROM information_schema.columns WHERE table_schema = target_database AND table_name = target_table_name AND column_name = target_column_name) THEN
    set @statement = CONCAT("ALTER TABLE ", target_table_name, " ADD COLUMN ", target_column_name, " VARCHAR(45) NULL");
    PREPARE STMT FROM @statement;
    EXECUTE STMT;
END IF;
END
//
DELIMITER ; -- 注意 DELIMITER 與分號之間有空格
CALL add_column();

有問題歡迎留言交流。

技術交流群:282575808

--------------------------------------

聲明: 原創文章,未經允許,禁止轉載!

--------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM