“语法错误或访问冲突”-从Schema :: Facade迁移时,但语句执行无错误

问题描述

我写了一份迁移文件,可以在测试数据库上很好地执行-进行了数十次测试都没有问题。我在生产数据库一个克隆上运行它,突然之间我遇到了各种各样的问题。我开始认为这是数据库配置或权限问题,但是我以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 破折号,使工作更加一致和可靠。对于 为什么 发生这种情况,我仍然感到是个谜,因为我以前在这样的日期中使用了连字符-正确引用了-没有问题。但这肯定使我陷入困境。我想我将完全停止在日期表名称中使用连字符的做法。与改进的可读性要求相比,它们似乎引起更多的头痛。