我刚刚使用(托管数据库)将应用程序部署到DigitalOcean,并且在调用php artisan migrate
时遇到以下错误
SQLSTATE[HY000]: General error: 3750 Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set. Add a primary key to the table or unset this variable to avoid this message. Note that tables without a primary key can cause performance problems in row-based replication, so please consult your DBA before changing this setting. (SQL: create table `sessions` (`id` varchar(255) not null, `user_id` bigint unsigned null, `ip_address` varchar(45) null, `user_agent` text null, `payload` text not null, `last_activity` int not null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')
当mysql var sql_require_primary_key
设置为true时,Laravel Migrations不起作用。
您对此有任何解决方案吗?
答案 0 :(得分:6)
只需添加set sql_require_primary_key = off
像这样
到您的SQL文件。
答案 1 :(得分:6)
我试图通过使用 WordPress 安装中的 mysqldump 文件导入到 DO Managed MySQL 来解决此问题。我发现将它添加到文件顶部确实对我的导入有用。
SET @ORIG_SQL_REQUIRE_PRIMARY_KEY = @@SQL_REQUIRE_PRIMARY_KEY;
SET SQL_REQUIRE_PRIMARY_KEY = 0;
然后我使用 JetBrains DataGrip 导入,并且没有错误。
答案 2 :(得分:2)
根据MySQL文档的目的,此系统变量是
避免复制性能问题:“启用此变量有助于避免表没有主键时可能发生的基于行的复制中的性能问题。”
恕我直言,有两种可能的解决方案可供您考虑;
创建新表或更改现有表结构的语句是否强制要求表具有primary key。
这也是bug report
答案 3 :(得分:1)
很遗憾,我们无法更改数字海洋 MySQL 数据库中的 sql_require_primary_key 值。相反,您可以通过添加 primary()
将 id 设置为主键答案 4 :(得分:1)
我通过工单联系了 DigitalOcean,询问他们是否要禁用该要求,他们第二天就这样做了:)
所以你可以问问他们
<块引用>感谢您与我们联系! 我了解您希望禁用托管数据库上的主要要求。您的托管数据库 ****** 的主要要求已被禁用
答案 5 :(得分:0)
启用后,sql_require_primary_key
具有以下作用:
即使表中还包含UNIQUE NOT NULL索引,也无法删除主键。
默认值为OFF
,但在您的情况下,您需要从OFF
设置ON
答案 6 :(得分:0)
将此行添加到您的迁移文件中。 $ table-> increments('aid');
答案 7 :(得分:0)
在您的第一次迁移中添加:
\Illuminate\Support\Facades\DB::statement('SET SESSION sql_require_primary_key=0');
内部:Schema::create()
函数。