【问题标题】:Laravel Migration Returning Invalid SQLLaravel 迁移返回无效的 SQL
【发布时间】:2020-01-12 13:15:35
【问题描述】:

我运行的是 Laravel 6.0.2,我的向上迁移方法如下:

Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('first_name');
            $table->string('last_name');
            $table->string('email')->unique();
            $table->string('password');
            $table->boolean('admin')->default(false);
            $table->boolean('manager')->default(false);
            $table->rememberToken();
            $table->timestamps();
});
create table `users` (
  `id` int unsigned not null auto_increment primary key,
  `first_name` varchar(255) not null,
  `last_name` varchar(255) not null,
  `email` varchar(255) not null,
  `password` varchar(255) not null,
  `admin` tinyint(1) not null default ('0'),
  `manager` tinyint(1) not null default ('0'),
  `remember_token` varchar(100) null,
  `created_at` timestamp null,
  `updated_at` timestamp null
) default character set utf8mb4 collate 'utf8mb4_unicode_ci'

我已经在在线语法检查器上运行了该 SQL,这给了我和 admin tinyint(1) not null default ('0'), 行上的错误。

我不确定这是否是 Laravel 6.0.2 的错误,因为它似乎在该更新之前有效。

有没有人遇到过这个问题并知道修复方法?

【问题讨论】:

  • 尝试在默认值上传递 0 而不是 False
  • SQL 语法看起来对 MariaDB 10.3 有效。哪个“在线语法检查器”报告错误?那个“在线语法检查器”是否执行与 MariaDB 相同的规则? MariaDB 是否报告语法错误? (似乎需要修复的是“在线语法检查器”,而不是 Laravel 或 MariaDB)
  • @aynber 不走运
  • 请尝试在连接属性(config/database.php)中设置'strict' => 'false'
  • 参考:docs.travis-ci.com/user/database-setup/#mariadb 我不熟悉 travis ci。生成的 SQL 语法对 MariaDB 10.3.x 有效。它可能在 MariaDB 10.2.x 中也有效

标签: php mysql laravel mariadb


【解决方案1】:

嗯,这很容易解决,也很容易被忽视。我猜你已经看太久了。

您的DEFAULTs 不需要括号或引号。引号仅用于字符串,而不是 ints,并且仅当它是子查询时才需要括号(这不太可能真正起作用,但我没有尝试过)。

http://www.w3webtutorial.com/mysql/mysql-default-constraint.php

【讨论】:

  • 不幸的是,如果 OP 手动创建架构,则此建议将起作用,但正在使用 Laravel 迁移。
  • 请记住问题中看到的 SQL 是从 Schema::create() 函数生成的;这不像“省略引号”那么简单。
  • SQL 语法似乎至少对 MariaDB 10.3 有效,因此不一定需要修复 SQL。 (另外,不要链接到 w3fools)
【解决方案2】:

在 mysql 中布尔类型是 tinyint 0 false 1 true ...


$table->boolean('admin')->default(0);

【讨论】:

  • 您是否有任何文档说明为什么它应该是 0 而不是 false?我知道它显然将 false 错误地转换为字符串 0,但有任何记录信息说明原因吗?添加它可以使这从一个很好的答案变成答案。
猜你喜欢
  • 1970-01-01
  • 2018-08-01
  • 1970-01-01
  • 2020-09-14
  • 2016-01-05
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
相关资源
最近更新 更多