在CREATE语句中使用的MySQL用户定义的常量或文字型

时间:2019-03-02 07:32:09

标签: mysql macros

我有一个脚本,可用于创建数据库中的所有表。在脚本的顶部,我想定义可以在整个脚本中使用的常量。

SET @moneyD = 6;
SET @priceM = 18; -- 999 billion

CREATE DATABASE IF NOT EXISTS `saver`;

CREATE TABLE `saver`.`test_Symbol` (
    `symbolId` BINARY(16) NOT NULL,
    `symbol` VARCHAR(32) NOT NULL,
    `dateCreated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`symbolId`),
    INDEX `symbolIndex` (`symbol` ASC)
);

CREATE TABLE `saver`.`test_SymbolChart` (
    `symbolChartId` BINARY(16) NOT NULL,
    `symbolId` BINARY(16) NOT NULL,
    `date` TIMESTAMP NOT NULL,
    `open` DECIMAL(@priceM, @moneyD) NULL,
    `high` DECIMAL(@priceM, @moneyD) NULL,
    `low` DECIMAL(@priceM, @moneyD) NULL,
    `close` DECIMAL(@priceM, @moneyD) NULL,
    `volume` INT NULL,
    `dateCreated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`symbolChartId`),
    INDEX `symbolIdIndex` (`symbolId` ASC)
);

但是,这不起作用,因为用户定义的变量在预期为常数文字的地方不起作用。

我还能如何实现我想要的行为?

1 个答案:

答案 0 :(得分:1)

您将需要使用准备好的语句以这种方式使用变量。试试这个:

SET @sql = CONCAT('CREATE TABLE `saver`.`test_SymbolChart` ( 
    `symbolChartId` BINARY(16) NOT NULL, 
    `symbolId` BINARY(16) NOT NULL, 
    `date` TIMESTAMP NOT NULL, 
    `open` DECIMAL(', @priceM, ',', @moneyD, ') NULL,
    `high` DECIMAL(', @priceM, ',', @moneyD, ') NULL,
    `low` DECIMAL(', @priceM, ',', @moneyD, ') NULL,
    `close` DECIMAL(', @priceM, ',', @moneyD, ') NULL,
    `volume` INT NULL,
    `dateCreated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`symbolChartId`),
    INDEX `symbolIdIndex` (`symbolId` ASC)
)');
PREPARE stmt FROM @sql;
EXECUTE stmt;

Demo on dbfiddle