mysql - 如何在 MariaDB 结构中为默认值定义变量?
问题描述
我需要为 MULTIPLE 表中的新条目更改很多 DB 结构的默认值,以便在 DB 中使用这个新的默认值我尝试使用这样的东西:
SET @money_rename_def := 20*10000;
SET @money_gender_def := 40*10000;
ALTER TABLE `money` CHANGE `money_rename` `money_rename` int(10) UNSIGNED NOT NULL DEFAULT '@money_rename_def',
CHANGE `money_gender` `money_gender` int(10) UNSIGNED NOT NULL DEFAULT '@money_gender_def';
但是 SET 前缀不会为 alter table 命令派生。有什么方法可以使用预定义的值,所以我只能在 SET 或类似定义中更改一次?我试图搜索文档,但可能只是错过了它?
解决方案
您可以像这样使用动态查询:
DROP PROCEDURE IF EXISTS `tableDefaultSetter`$$
CREATE PROCEDURE `tableDefaultSetter`()
BEGIN
SET @default1 = 20;
SET @query = concat('ALTER TABLE `ttestt` CHANGE `val` `val` int NOT NULL DEFAULT ', @default1);
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
样本数据:
DROP TABLE IF EXISTS ttestt;
CREATE TABLE ttestt
(
id INT,
val INT(10) DEFAULT 10
);
INSERT INTO ttestt (id)
VALUES (1);
CALL tableDefaultSetter();
INSERT INTO ttestt (id)
VALUES (1);
SELECT *
FROM ttestt;
结果:
1,10
1,20
所以第一项有 10 作为默认值,第二项已更改为 20。您会看到它有效。
对于多个值,您不能将多个查询放在一个语句中: Doc
文本必须代表单个语句,而不是多个语句。
因此,为了方便起见,您可以创建另一个过程:
DELIMITER $$
DROP PROCEDURE IF EXISTS `exec_query`$$
CREATE PROCEDURE `exec_query`(queryStr TEXT)
BEGIN
SET @query = queryStr;
PREPARE stmt FROM @query;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DROP PROCEDURE IF EXISTS `tableDefaultSetter`$$
CREATE PROCEDURE `tableDefaultSetter`()
BEGIN
SET @default1 = 20;
SET @default2 = 30;
SET @default3 = 40;
SET @default4 = 50;
CALL exec_query(concat('ALTER TABLE `ttestt` CHANGE `val` `val` int NOT NULL DEFAULT ', @default1));
CALL exec_query(concat('ALTER TABLE `ttestt2` CHANGE `val` `val` int NOT NULL DEFAULT ', @default2));
CALL exec_query(concat('ALTER TABLE `ttestt3` CHANGE `val` `val` int NOT NULL DEFAULT ', @default3));
CALL exec_query(concat('ALTER TABLE `ttestt4` CHANGE `val` `val` int NOT NULL DEFAULT ', @default4));
END$$
DELIMITER ;
像这样使用它:
CALL tableDefaultSetter();
DROP PROCEDURE `tableDefaultSetter`;
DROP PROCEDURE `exec_query`;
推荐阅读
- react-native - 如何为不同用户创建单独的导航抽屉:React 导航 v5
- python-2.7 - 皮林特和蟒蛇
运行关于包的相对导入的冲突('没有命名的模块 ' 如果我按照 pylint 方式进行操作,则会出错) - r - 如何使用 R 中其他列的值格式化字符串
- javascript - 为什么我的 D3.csv() 方法返回“未定义”
- bash - 我如何将文件名存储为shell脚本中的变量
- r - 缺失单元的自动插值
- spring - Spring mvc 找不到 post 方法的表示
- r - 根据R中循环内两个数据帧中的匹配值进行过滤
- python - 中断 GNU Parallel 后如何将 KeyboardInterrupt 提升到 Python 脚本?
- kubernetes - 如何在 Kubernetes 中使用 tqdm