请教关于 MySQL 分表的 SQL 语句如何生成比较好?

比如经常需要对 MySQL 数据库表进行分表,看如下建表 SQL:

CREATE TABLE `gift_user_log_1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `giftid` int(11) NOT NULL,
  `userid` int(11) NOT NULL,
  `total` int(11) NOT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

如果需要建 50 张这样的表,岂不是复制粘贴 50 次,然后手动修改表名的序号,显然不可行,但是 PHP 框架本身没有提供数据库这方面的工具。

于是自己写个 PHP 脚本生成建表 SQL:

<?php
$sql = <<<EOF
CREATE TABLE `gift_user_log_%s` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `giftid` int(11) NOT NULL,
  `userid` int(11) NOT NULL,
  `total` int(11) NOT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\r\n\r\n
EOF;

$createTableSql = '';

for($i=1; $i<=50; $i++){
    $createTableSql .= sprintf($sql, $i);
}

file_put_contents('create_gift_user_log_table.sql', $createTableSql);

这样就生成了 50 个建表 SQL 的文本文件,再一次执行就好了。

但是,除此之外,大家一般建分表的时候采取什么办法?那种方式更好?

另外,在 Laravel 中如果要建大量分表,大家有没有实际经验,可以用他的 database migrate 吗?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
php
        for($i=1;$i<=50;$i++) {
            $sql = "CREATE TABLE `gift_user_log_{$i}` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `giftid` int(11) NOT NULL,
  `userid` int(11) NOT NULL,
  `total` int(11) NOT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;";
            DB::statement($sql);
        }

写迁移文件里 up 方法。

或者

php
    public function up()
    {
        for($i=1;$i<=50;$i++) {
            Schema::create("gift_user_log_{$i}", function($table) {
                # 你的字段类型代码
            });
        }
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        for($i=1;$i<=50;$i++) {
            Schema::drop("gift_user_log_{$i}");
        }
    }

以上都是一次性建够所需要的表。

如果是需要动态建表,那么就写个 command 命令,按需触发。

这是我的思路 :smile: 看能帮上忙不。

7年前 评论

@zhuzhichao 恩,如果写在 Laravel 里这样写,也想到了。我们这个项目不是 Laravel 框架,也没这种数据库迁徙工具,就只能我这样生成了,我自己都怀疑这不是最好方式

7年前 评论

@纸牌屋弗兰克 偶尔用一次,解决问题就是好方法。 :smile:

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!