【发布时间】:2017-06-10 05:37:32
【问题描述】:
我想根据表格是否具有特定列来动态更改表格。
我的数据库名称是summer_cms,里面有50多张表。
我想要的如下:
- 如果表中有一个名为
add_time的列,那么我想在其中添加一个列add_user_id。 - 同样,如果找到
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
谁能告诉我我遗漏了什么或错了什么?任何帮助将不胜感激。
【问题讨论】:
-
意思是它所说的-尝试使用动态sql。
-
@P.Salmon 通过其他方式,我可以确认变量
tableName已被赋值。我只是不知道为什么会这样。 -
是的,但在 alter 语句中没有变量替换 - 它认为它正在改变一个名为 tablename 的表。
-
@P.Salmon 你能告诉我如何修复
procedure来解决我的问题吗?任何提示将不胜感激。