4

我正在为 minecraft 的一组服务器创建一个数据库,并且我设置它的方式是,我希望在添加每个服务器时为其创建一个表。目前,除了我无法获取正在创建的包含 IP 地址的表之外,我一切正常。我希望该表类似于 [IP]_Players,其中 [IP] 被实际 IP 地址替换,该地址将通过创建它的函数发送。这是我到目前为止所拥有的:

DELIMITER $$

CREATE PROCEDURE `minecraft`.`AddServer` (ip Text)
BEGIN
DECLARE play TEXT;
DECLARE tran TEXT;
SET play = ip + '_Players';
SET tran = ip + '_Transactions';
INSERT INTO `minecraft`.`Server_Data` (`Server_IP`) VALUES (ip);
CREATE TABLE `minecraft`.play (
  `Player` TEXT NOT NULL ,
  `Balance` DOUBLE NOT NULL DEFAULT 100 ,
  `Warnings` INT NOT NULL DEFAULT 0 ,
  `Offences` INT NOT NULL DEFAULT 0 ,
  UNIQUE INDEX `Player_UNIQUE` (`Player` ASC) );
CREATE  TABLE `minecraft`.tran (
  `Time` TIMESTAMP NOT NULL ,
  `Player` TEXT NOT NULL ,
  `Destination` TEXT NOT NULL ,
  `Amount` DOUBLE NOT NULL ,
  `Description` TEXT NOT NULL ,
  PRIMARY KEY (`Time`) );
END

它不是在执行时将其创建为 192.168.001.107_Players CALL minecraft.AddServer('192.168.001.107'); ,而是创建一个名为play. 我究竟做错了什么?

4

2 回答 2

1

我猜你必须使用准备好的陈述

SQL 语法准备语句

于 2012-11-02T02:24:28.957 回答
1

我在玩,让这个工作。请注意,表名中不能有句点。因此,您可能希望使用 REPLACE 函数将句点替换为下划线。

DELIMITER $$

CREATE PROCEDURE `minecraft`.`AddServer` (ip Text)
BEGIN
DECLARE play varchar(500);
DECLARE STMT varchar(500);
SET play = CONCAT(ip, '_Players');
SET @sql_stmt = CONCAT('CREATE TABLE minecraft.', play, ' (
  `Player` VARCHAR(50) NOT NULL ,
  `Balance` DOUBLE NOT NULL DEFAULT 100 ,
  `Warnings` INT NOT NULL DEFAULT 0 ,
  `Offences` INT NOT NULL DEFAULT 0 ,
  UNIQUE INDEX `Player_UNIQUE` (`Player` ASC) );');
PREPARE STMT FROM @sql_stmt;
EXECUTE STMT;
END$$

Delimiter ;
于 2012-11-02T03:12:45.973 回答