请教关于 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 吗?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《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年前 评论

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