【问题标题】:Set table names using user-defined variables in MySQL stored procedures在 MySQL 存储过程中使用用户定义的变量设置表名
【发布时间】:2011-03-13 18:36:15
【问题描述】:

我想创建一个名称取自用户定义变量的表。以下代码似乎不起作用(我在 CREATE TABLE 行附近收到 MYSQL 语法错误)

提前感谢您的帮助

SET @ratingsNewTableName = CONCAT('ratings_', 'anotherString');

CREATE TABLE IF NOT EXISTS @ratingsNewTableName (
   `id` INT(11) NOT NULL AUTO_INCREMENT,
   `user_id` INT(11) NOT NULL,
   `movie_id` INT(11) NOT NULL,
   `rate` DOUBLE NOT NULL,
   `date` DATE NOT NULL,
   PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

【问题讨论】:

    标签: mysql variables procedures user-defined


    【解决方案1】:
    SET @sql := CONCAT('CREATE TABLE IF NOT EXISTS ', @tableName,'( id INT(11) NOT NULL AUTO_INCREMENT, user_id INT(11) NOT NULL, movie_id INT(11) NOT NULL, rate DOUBLE NOT NULL, date DATE NOT NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1' ); 
    PREPARE mySt FROM @sql; 
    EXECUTE mySt;
    

    【讨论】:

    • 这可能很明显,但请务必先定义@tableName。 :-)
    【解决方案2】:

    我想创建一个名称取自用户定义变量的表

    不是您问题的答案,但我认为这是一个坏主意。它会招来一堆的麻烦。

    • 您必须处理表名中的特殊字符和编码

    • 你必须过滤掉characters forbidden in a table name

    • 可用字符的范围取决于底层文件系统的能力,因为 mySQL 使用表名创建其数据文件

    • 您可能会遇到长期麻烦,因为 mySQL 在不同系统上对表的处理方式不同。区分大小写由底层文件系统决定(表名在 Linux/Unix 上区分大小写,在 Windows 上不区分大小写)

    我不会这样做。我宁愿有一个大表和一个较小的用户表。我会将用户指定的变量保存在用户表中,并在巨大的表中保存所有用户的所有记录,并通过“用户”键分开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      相关资源
      最近更新 更多