gpt4 book ai didi

Mysql调用过程在动态更改其中的表时失败

转载 作者:行者123 更新时间:2023-11-29 18:00:31 25 4
gpt4 key购买 nike

我想根据表是否具有特定列来动态更改表。

我的数据库名称是summer_cms,其中有超过50个表。

我想要的如下:

  1. 如果表中有一个名为 add_time 的列,那么我想在其中添加一个 add_user_id 列。
  2. 同样,如果找到 update_time,我想在表中添加 update_user_id

我知道我应该在创建数据库模式的过程中将其记下来,但是我的数据库已经构建完成,我必须根据需要更改它。

所以我创建了一个过程来做到这一点:

CREATE PROCEDURE ALTER_SUMMER_TABLE()
BEGIN
DECLARE tableName VARCHAR(64);
DECLARE exitence VARCHAR(64);

DECLARE ntable INT; # number of tables
DECLARE i INT; # index
SET i = 0;

# get the count of table
SELECT COUNT(DISTINCT(TABLE_NAME)) INTO ntable FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'summer_cms';

WHILE i < ntable DO
# select the specific table name into the variable of `tableName`.
SELECT TABLE_NAME INTO tableName
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'summer_cms'
AND COLUMN_NAME = 'add_time'
LIMIT 1 OFFSET i;

# alter table, but I get error in this clause.
ALTER TABLE tableName ADD COLUMN `add_user_id` INT NOT NULL DEFAULT 0 COMMENT 'add user id';

# check if the table has `update_time`
SELECT TABLE_NAME INTO exitence
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'summer_cms'
AND TABLE_NAME = tableName
AND COLUMN_NAME = 'update_time';

# add `update_user_id` if `update_time` be found.
IF exitence THEN
ALTER TABLE tableName ADD COLUMN `update_user_id` INT NOT NULL DEFAULT 0 COMMENT 'update user id';
END IF;
SET i = i + 1;
END WHILE;
END

但是当我调用此过程时出现错误。

Procedure execution failed
1146 - Table 'summer_cms.tableName' doesn't exist

有人可以告诉我我遗漏了什么或错了吗?任何帮助将不胜感激。

最佳答案

您可以对程序进行一些更改,使其更加简化并解决一些问题。

首先使用光标选择表名称,而不是使用两个选择您使用的表名称。其次使用准备好的语句来允许您动态设置表名...

DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `ALTER_SUMMER_TABLE`()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE tableName VARCHAR(64);
declare cur cursor for SELECT TABLE_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'summer_cms'
AND COLUMN_NAME = 'add_time';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

open cur;

start_loop: loop
fetch cur into tableName;
if (done = 1 )THEN
LEAVE start_loop;
END IF;
SET @sql = CONCAT('ALTER TABLE ', tableName,' ADD COLUMN `add_user_id` INT NOT NULL DEFAULT 0 ');
PREPARE stmt FROM @sql;
EXECUTE stmt;

end loop;

close cur;
END$$
DELIMITER ;

您可以进行一些调整 - 例如,仅获取列尚不存在的表名称。

关于Mysql调用过程在动态更改其中的表时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48402018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com