我正在为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
的表。
我做错了什么?
答案 0 :(得分:1)
你必须使用准备好的陈述
答案 1 :(得分: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 ;