我如何为 MariaDB 结构中的默认值定义变量?

How can i define variable for default values in MariaDB structure?

我需要为 MULTIPLE tables 中的新条目更改数据库结构的很多默认值,以便在数据库中拥有这个新的默认值我尝试使用这样的东西:

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

The text must represent a single statement, not multiple statements.

因此您可以为方便起见创建另一个过程:

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