问题描述
我写了一份迁移文件,可以在测试数据库上很好地执行-进行了数十次测试都没有问题。我在生产数据库的一个克隆上运行它,突然之间我遇到了各种各样的问题。我开始认为这是数据库配置或权限问题,但是我以root用户身份登录到此克隆,所以我什至不知道从哪里开始寻找...
如果我从错误中复制MysqL语句(...并修复丢失的数据),则该语句将执行而不会出现问题。
ALTER TABLE `retail_items-tmp_09-10-2020` CHANGE original_inventory initial_inventory INT DEFAULT NULL;
违规行:
Schema::table('retail_items-tmp_09-10-2020',function($table) {
$table->renameColumn('original_inventory','initial_inventory');
});
错误:
[PDOException (42000)]
sqlSTATE[42000]: Syntax error or access violation: 1064 You have an error in your sql Syntax; check the manual that corresponds to your MysqL server version for the right Syntax to use near '-tmp_09-10-2020 CHANGE original_inventory initial_inventory INT DEFAULT NULL' at line 1
迁移:
public function up()
{
/* 1. Backup Existing Tables */
DB::statement('CREATE TABLE `retail_items-tmp_09-10-2020` LIKE `retail_items`; ');
DB::statement('CREATE TABLE `ARCH__retail_items_09-10-2020` LIKE `retail_items`; ');
DB::statement('INSERT INTO `retail_items-tmp_09-10-2020` SELECT * FROM `retail_items`; ');
DB::statement('INSERT INTO `ARCH__retail_items_09-10-2020` SELECT * FROM `retail_items`;');
/* 2. Update structure */
Schema::table('retail_items-tmp_09-10-2020',function($table) {
$table->renameColumn('original_inventory','initial_inventory');
});
Schema::table('retail_items-tmp_09-10-2020',function($table) {
$table->integer('event_ID')->length(11)->unsigned()->nullable();
$table->foreign('event_ID')->references('event_ID')->on('events');
});
/* 3. Update structure that would have been destructive prior to step 3 */
// When I had this piece of code included,it resulted in the same error "Syntax error or access violation..." this worked in testing,but throws errors on Prod,changed to DB:statement below with success.
// Schema::table('retail_items-tmp_09-10-2020',function($table) {
// $table->smallInteger('flag')->unsigned()->nullable(false)->default(0)->change();
// });
$query = "ALTER TABLE `retail_items-tmp_09-10-2020` CHANGE `flag` `flag` SMALLINT(11) DEFAULT 0 NOT NULL; ";
DB::statement($query);
}
我对此一直停留了一段时间,因此,任何理论,看的地方等等,都将不胜感激。
(我还有另一个迁移,它在此结尾重命名了temp表。我进行了一些迁移和数据操作,总共花了大约10+分钟的时间来执行与我启动该代码所用的代码段,因此临时表对于防止在生产环境中启动时的停机是必不可少的)
解决方法
在这个问题上,我仍然有更多的疑难解答/其他障碍,所以这只消除了一个...
即使正确引用了它们,我也阅读了一些S.O。就像Webtect所建议的那样,我最终只是删除了 all 破折号,使工作更加一致和可靠。对于 为什么 发生这种情况,我仍然感到是个谜,因为我以前在这样的日期中使用了连字符-正确引用了-没有问题。但这肯定使我陷入困境。我想我将完全停止在日期表名称中使用连字符的做法。与改进的可读性要求相比,它们似乎引起更多的头痛。