我有一个脚本,可用于创建数据库中的所有表。在脚本的顶部,我想定义可以在整个脚本中使用的常量。
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)
);
但是,这不起作用,因为用户定义的变量在预期为常数或文字的地方不起作用。
我还能如何实现我想要的行为?
答案 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;