我正在尝试将外键应用于与表用户
的ID相关的user_id列我尝试通过迁移和在工作台中执行此操作,并且此错误不断出现:
违反完整性约束:1452无法添加或更新子级 行:外键约束失败
这是mysql:
ALTER TABLE `dh_booky`.`books`
ADD CONSTRAINT `books_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `dh_booky`.`users` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
第一本迁移书籍:
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('title_id')->unsigned();
$table->foreign('title_id')->references('id')->on('titles');
$table->bigInteger('author_id')->unsigned();
$table->foreign('author_id')->references('id')->on('authors');
$table->string('image')->nullable();
});
}
更新迁移书籍:
class UpdateBooksTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->bigInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
//php artisan make:migration update_votes_table
});
用户迁移:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
});
}
答案 0 :(得分:1)
似乎您在更新 UpdateBooksTable 迁移中的 users 表而不是 books 表。
您可能已经在books表上有了数据。因此,现有书籍没有引用user_id,这会导致错误。
您可以将 nullable()添加到user_id,以便现有书籍的user_id为null。
class UpdateBooksTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
//Seem you are updating books table. change users to books
Schema::table('users', function (Blueprint $table) {
$table->bigInteger('user_id')->unsigned()->nullable();
$table->foreign('user_id')->references('id')->on('users');
});
}
}
答案 1 :(得分:1)
将用户迁移设置为在books表迁移发生之前的更早版本。否则,在创建books表时,尚无要引用的用户表,因此会出错。
这第一:
Schema::create('users', function (Blueprint $table) {...}
然后,在创建books表时,用户的外键将有一个表可连接。
答案 2 :(得分:0)
迁移文件代码应位于以下位置:
Schema::table('books', function (Blueprint $table) {
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')
->on('users')
->references('id');
});
可以这样产生SQL:
ALTER TABLE books
ADD CONSTRAINT books_user_id_foreign
FOREIGN KEY fk_user_id(user_id)
REFERENCES users (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION;