在mysql中创建表时使用变量作为表名

Posted

技术标签:

【中文标题】在mysql中创建表时使用变量作为表名【英文标题】:Use a variable as table name when creating a table in mysql 【发布时间】:2017-02-05 00:08:15 【问题描述】:

我有变量 whos 的值是 0 到 1000 之间的随机数,我想在创建新表时使用它作为名称。我试图通过将我的 sql 与存储随机数的变量连接起来来做到这一点,这没有奏效,有没有办法做到这一点?谢谢

include 'includes/db_connect_ssg.php';

if (isset($_POST['new_user_name'])&&isset($_POST['new_user_password'])) 
    $username = $_POST['new_user_name'];
    $password  = $_POST['new_user_password'];
    $randID = rand(0,1000);
    $sql = "INSERT INTO `Users`(`id`, `username`, `password`, `admin`, `href`) VALUES ('$randID','$username','$password','0','ssgprofile.php?id=$randID')";

    $query = mysqli_query($dbc, $sql);

    $id = (string)$randID;



        $q = "CREATE TABLE CONCAT('userTable_',$id) (
        id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        firstname VARCHAR(30) NOT NULL,
        lastname VARCHAR(30) NOT NULL,
        email VARCHAR(50),
        reg_date TIMESTAMP
        )";




    $qquery = mysqli_query($dbc, $q);



    if ($query&&$qquery) 
        include 'admin_loadUsers.php';
    else
        echo "Could not connect sorry please try again later, for more info please contact BB Smithy at 0838100085";
    

【问题讨论】:

【参考方案1】:

你可以使用:

$q = "CREATE TABLE `userTable_".$id."` (
        id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        firstname VARCHAR(30) NOT NULL,
        lastname VARCHAR(30) NOT NULL,
        email VARCHAR(50),
        reg_date TIMESTAMP
        )";

但请注意,创建名称中包含数字的表几乎总是数据库设计不良的标志。

不要只用一行创建许多表,只需将列 firstname、lastname、email 和 reg_date 添加到表 Users 中。此外,您通过调用 rand(0,1000) 生成用户 ID 的方式将导致冲突(rand 将返回一个已在用户表中用作 ID 的值)。使用 AUTO_INCREMENT 生成用户 ID。

【讨论】:

您好,感谢您的帮助,我是数据库设计的新手,非常感谢您的意见,我正在构建一个拥有少量用户的 Web 应用程序,他们看到的内容由管理员用户,他可以在访问用户个人资料时添加和删除内容。我需要一种根据正在显示的页面配置文件来显示内容的方法。关于此或资源的任何想法,您可以指出我,感谢您的时间 不要只用一行创建多个表,只需将列firstnamelastnameemailreg_date 添加到表Users。此外,您通过调用rand(0,1000) 生成用户ID 的方式将导致colisions(rand 将返回一个已在Users 表中用作ID 的值)。为什么不用AUTO_INCREMENT 来生成用户ID? 用户数据存储在由用户名密码等组成的用户表中,但是我需要一个表来存储每个用户不同的大量链接,因为它们是由管理员用户。上面示例中的列是我用于测试目的的列。 那么我建议创建表CREATE TABLE Links (id int unsigned not null primary key auto_increment, userId int not null, link varchar(500))。列userId 用于将Links 表中的一行链接到Users 表中的用户。 link 列包含链接本身(如果我理解正确,链接是指 URL)。【参考方案2】:

您没有有效的表名

来自 Mysql 文档:

Identifiers may begin with a digit but unless quoted may not consist solely of digits

【讨论】:

您好,感谢您的输入,我使用了一些类型转换将 $randID 转换为字符串值并在查询中使用了 CONCAT() 函数,但这仍然没有任何想法?

以上是关于在mysql中创建表时使用变量作为表名的主要内容,如果未能解决你的问题,请参考以下文章

oracle中创建表如何不产生日志

如何在mysql中实现将当前的时间作为建表时的表名

数据库建立表格代码?

如何获得在Oracle中创建表时使用的查询?

在mysql集群中创建表时出错

在配置单元中创建表时向列添加默认值