我正在使用带有Postgres数据库的Laravel 5.6和Heroku。
我已将我的应用程序上传到Heroku,登录表单正确显示了它。
使用以下命令进行表迁移时会出现问题:
heroku run php artisan migrate
并使用Heroku的Postgres,我正确地进行了所有配置,但是在进行迁移时会发生这种情况:
在Connection.php第664行中:
SQLSTATE [42830]:无效的外键:7错误:没有唯一的 约束匹配给定表“用户”的给定键(SQL: 更改表“ sales”添加约束“ sales_user_id_foreign”外键 (“ user_id”)引用了“ us ers”(“ id”))
在Connection.php第458行:
SQLSTATE [42830]:无效的外键:7错误:没有唯一的 约束匹配给定表“用户”的给定键
奇怪的是,相同的本地迁移不会给我造成任何问题(MySQL),但是带有Postgres的Heroku会显示错误。
这些是我的用户和销售迁移:
用户:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->integer('id')->unsigned();
$table->foreign('id')->references('id')->on('people')->onDelete('cascade');
$table->string('user')->unique();
$table->string('password');
$table->boolean('state')->default(1);
$table->integer('idRole')->unsigned();
$table->foreign('idRole')->references('id')->on('roles');
$table->rememberToken();
//$table->timestamps();
});
}
销售:
public function up()
{
Schema::create('sales', function (Blueprint $table) {
$table->increments('id');
$table->integer('client_id')->unsigned();
$table->foreign('client_id')->references('id')->on('people');
$table->unsignedInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
$table->dateTime('date_time');
$table->decimal('total', 11, 2);
$table->string('status', 20);
$table->timestamps();
});
}
我不知道为什么我在Heroku中有此错误,但是一切都在本地运行。我该如何解决?
答案 0 :(得分:0)
这是因为表id
上的users
列没有唯一约束。
您可以将id
列设置为自动递增,然后再次运行迁移:
用户
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
// Other codes
});
}
答案 1 :(得分:0)
奇怪的是,相同的本地迁移不会给我造成任何问题(MySQL),但是带有Postgres的Heroku会显示错误。
在开发和生产中使用相同的数据库软件总是一个好主意。即使使用ORM和模式迁移工具,MySQL和PostgreSQL也不是彼此的直接替代品。肯定在某些情况下,一个人会快乐而另一个人不会。
我怀疑如果在Heroku上使用MySQL,您的问题将消失。 Heroku本身不提供MySQL,但是您可以使用a couple of addons。 JawsDB和ClearDB都是流行的选项,或者,如果您愿意,也可以在RDS之类的主机上托管自己的MySQL数据库。
您还可以在本地切换到Postgres,看看是否可以重现该错误。