4

マインクラフト用のサーバーのコレクション用のデータベースを作成しています。セットアップ方法では、サーバーが追加されるたびにテーブルを作成したいと考えています。現時点では、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 に答える