首页 > 解决方案 > 如何在 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 或类似定义中更改一次?我试图搜索文档,但可能只是错过了它?

标签: mysqllinuxdatabasemariadbset

解决方案


您可以像这样使用动态查询:

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`;

推荐阅读