没有主键无法创建或更改表-Laravel DigitalOcean托管数据库

时间:2020-06-16 21:47:02

标签: mysql laravel migration digital-ocean

我刚刚使用(托管数据库)将应用程序部署到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不起作用。

您对此有任何解决方案吗?

8 个答案:

答案 0 :(得分:6)

只需添加set sql_require_primary_key = off 像这样

Click to view image

到您的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

  • 根据here“我们仅支持MySQL v8。”来更改您的提供程序。

这也是bug report

答案 3 :(得分:1)

很遗憾,我们无法更改数字海洋 MySQL 数据库中的 sql_require_primary_key 值。相反,您可以通过添加 primary()

将 id 设置为主键

答案 4 :(得分:1)

我通过工单联系了 DigitalOcean,询问他们是否要禁用该要求,他们第二天就这样做了:)

所以你可以问问他们

<块引用>

感谢您与我们联系! 我了解您希望禁用托管数据库上的主要要求。您的托管数据库 ****** 的主要要求已被禁用

答案 5 :(得分:0)

启用后,sql_require_primary_key具有以下作用:

  1. 尝试创建没有主键的新表失败,并显示错误。这包括CREATE TABLE ... LIKE。除非CREATE TABLE部分包含主键定义,否则它还包括CREATE TABLE ... SELECT。
  2. 尝试从现有表中删除主键失败并显示错误,但允许删除主键并在同一ALTER TABLE语句中添加主键的例外。

即使表中还包含UNIQUE NOT NULL索引,也无法删除主键。

  1. 尝试导入没有主键的表失败,并显示错误。

默认值为OFF,但在您的情况下,您需要从OFF设置ON

IMPORTANT LINK

HOW TO SET

答案 6 :(得分:0)

将此行添加到您的迁移文件中。 $ table-> increments('aid');

答案 7 :(得分:0)

在您的第一次迁移中添加:

\Illuminate\Support\Facades\DB::statement('SET SESSION sql_require_primary_key=0');

内部:Schema::create() 函数。