我正在尝试为我的数据库创建一个新表。
我之前创建了一个带有 PK (IdCorso) 的表 (tipo),然后是另一个表 (corsoscii),其外键与 tipo 相关联。
当我为 corsoscii 执行 artisan 命令时
php artisan migrate --path='./database/migrations/2021_02_23_155544_create_corsoscii_table.php'
它给了我这个错误:
("SQLSTATE[HY000]: General error: 1005 Can't create table impianto_scii.corsoscii (errno: 150 "Foreign key constraint is incorrectly formed")")
这是“tipo”的设置代码
public function up()
{
Schema::create('tipo', function (Blueprint $table) {
$table->increments('idCorso');
$table->string('descrizione');
$table->timestamps();
});
}
...对于“corsoscii”
public function up()
{
Schema::create('corsoscii', function (Blueprint $table) {
$table->increments('idCorso');
$table->integer('tipo');
$table->string('nome');
$table->integer('membriMax');
$table->date('inizio');
$table->date('fine');
$table->timestamps();
});
Schema::table('corsoscii', function(Blueprint $table){
$table->foreign('tipo')
->references('idCorso')->on('tipo')
->onDelete('cascade');
$table->primary('idCorso');
});
}
我是 Laravel 的新手,欢迎提供任何建议。
答案 0 :(得分:3)
$table->integer('tipo');
需要完全匹配作为外键的字段。
$table->increments('idCorso');
生成一个 unsignedInteger
,所以它应该是这样的。
$table->unsignedInteger('tipo');
如果您的迁移使用 bigIncrements
,则需要使用:
$table->unsignedBigInteger('tipo');
答案 1 :(得分:1)
请先运行
php artisan migrate:rollback
然后删除“corsoscii”表。然后尝试这些更改。
Schema::create('corsoscii', function (Blueprint $table) {
$table->increments('idCorso');
$table->integer('tipo')->unsigned();;
$table->string('nome');
$table->integer('membriMax');
$table->date('inizio');
$table->date('fine');
$table->timestamps();
});
Schema::table('corsoscii', function(Blueprint $table){
$table->foreign('tipo')
->references('idCorso')->on('tipo')
->onDelete('cascade');
});
首先尝试 unsigned() 用于tipo,然后当您将使用 increments() 方法时 idCorso 已经是主键。然后运行
php artisan migrate
这会正常工作。我试过了。