2012-11-02 100 views
4

我正在創建一個用於Minecraft的服務器集合的數據庫,以及我設置的方式,我希望爲每個添加的服務器創建一個表。目前,除了事實上,我無法獲取正在創建的表以包含IP地址,因此我有所有工作。我希望表格類似[IP] _Players,其中[IP]由實際的IP地址替換,它將通過正在創建的函數發送。以下是我迄今爲止:創建MySQL變量表命名

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。 我在做什麼錯?

回答

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 ; 
+0

謝謝,這解決了我的一些其他問題 – Oa10712