Vi phạm ràng buộc toàn vẹn: 1452 Không thể thêm hoặc cập nhật hàng con:


84

Tôi đang cố gắng chèn các giá trị vào bảng nhận xét của mình và tôi gặp lỗi. Nó nói rằng tôi không thể thêm hoặc cập nhật hàng con và tôi không biết điều đó có nghĩa là gì.

lược đồ của tôi trông giống như thế này

-- ----------------------------
-- Table structure for `comments`
-- ----------------------------
DROP TABLE IF EXISTS `comments`;
CREATE TABLE `comments` (
  `id` varchar(36) NOT NULL,
  `project_id` varchar(36) NOT NULL,
  `user_id` varchar(36) NOT NULL,
  `task_id` varchar(36) NOT NULL,
  `data_type_id` varchar(36) NOT NULL,
  `data_path` varchar(255) DEFAULT NULL,
  `message` longtext,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_comments_users` (`user_id`),
  KEY `fk_comments_projects1` (`project_id`),
  KEY `fk_comments_data_types1` (`data_type_id`),
  CONSTRAINT `fk_comments_data_types1` FOREIGN KEY (`data_type_id`) REFERENCES `data_types` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_comments_projects1` FOREIGN KEY (`project_id`) REFERENCES `projects` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_comments_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;

-- ----------------------------
-- Records of comments
-- ----------------------------

-- ----------------------------
-- Table structure for `projects`
-- ----------------------------
DROP TABLE IF EXISTS `projects`;
CREATE TABLE `projects` (
  `id` varchar(36) NOT NULL,
  `user_id` varchar(36) NOT NULL,
  `title` varchar(45) DEFAULT NULL,
  `description` longtext,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_projects_users1` (`user_id`),
  CONSTRAINT `fk_projects_users1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;

-- ----------------------------
-- Records of projects
-- ----------------------------
INSERT INTO `projects` VALUES ('50dcbc72-3410-4596-8b71-0e80ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', 'Brand New Project', 'This is a brand new project', '2012-12-27 15:24:02', '2012-12-27 15:24:02');

và câu lệnh mysql mà tôi đang cố gắng thực hiện trông giống như thế này

INSERT INTO `anthonyl_fbpj`.`comments` (`project_id`, `user_id`, `task_id`, `data_type_id`, `message`, `modified`, `created`, `id`) 
VALUES ('50dc845a-83e4-4db3-8705-5432ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', '1', '50d32e5c-abdc-491a-a0ef-25d84e9f49a8', 'this is a test', '2012-12-27 19:20:46', '2012-12-27 19:20:46', '50dcf3ee-8bf4-4685-aa45-4eb4ae7aaee3')

lỗi tôi nhận được trông như thế này

SQLSTATE [23000]: Vi phạm ràng buộc toàn vẹn: 1452 Không thể thêm hoặc cập nhật hàng con: ràng buộc khóa ngoại không thành công ( anthonyl_fbpj. comments, CONSTRAINT fk_comments_projects1 FOREIGN KEY ( project_id) TÀI LIỆU THAM KHẢO projects( id) BẬT XÓA KHÔNG CÓ HÀNH ĐỘNG KHI CẬP NHẬT KHÔNG CÓ HÀNH ĐỘNG)

Câu trả lời:


123

Nó chỉ đơn giản có nghĩa là giá trị cho cột project_idtrên bảng commentsbạn đang chèn không tồn tại trên bảng projects. Hãy nhớ rằng giá trị của cột project_idtrên bảng commentsphụ thuộc vào giá trị của IDtrên bảng Projects.

Giá trị 50dc845a-83e4-4db3-8705-5432ae7aaee3bạn đang chèn cho cột project_idkhông tồn tại trên bảng projects.


25
Nếu tôi có giá trị trong bảng đó thì sao? Tôi gặp lỗi tương tự nhưng tôi có các giá trị trong bảng và ID khớp.
Sergey Romanov

4
Tôi đã gặp sự cố tương tự. Xóa dữ liệu cũ khỏi bảng đã giải quyết được sự cố trong trường hợp của tôi.
Yojan

2
Yojan, chúng ta nên xóa bảng nào, bảng "cha" hay "con" (phụ thuộc)?
Peanuts

46

Đảm bảo rằng bạn có project_idtrong fillabletài sản của Commentmô hình của bạn .

Tôi đã gặp vấn đề tương tự, và đây là lý do.


8
Tương tự ở đây, sử dụng Laravel. Tốt lắm.
PapaHotelPapa

8

Ngoài ra, hãy đảm bảo rằng khóa ngoại bạn thêm vào cùng loại với cột ban đầu, nếu cột bạn đang tham chiếu không cùng loại, nó cũng sẽ bị lỗi.


5

Nếu bạn đang thêm khóa ngoại mới vào bảng hiện có và các cột không rỗng và không được gán giá trị mặc định, bạn sẽ gặp lỗi này,

Hoặc bạn cần phải làm cho nó nullablehoặc assign default value, hoặc delete all the existing recordsđể giải quyết nó.


4

Đầu tiên hãy xóa ràng buộc "fk_comments_projects1" và cả chỉ mục của nó. Sau đó tạo lại nó.


4

Tôi hy vọng quyết định của tôi sẽ giúp ích. Tôi đã gặp lỗi tương tự trong Laravel. Tôi đã thêm khóa ngoại vào bảng sai.
Sai mã:

Schema::create('comments', function (Blueprint $table) {
$table->unsignedBigInteger('post_id')->index()->nullable();
...
$table->foreign('post_id')->references('id')->on('comments')->onDelete('cascade');
    });


Schema::create('posts', function (Blueprint $table) {
    $table->bigIncrements('id');
    ...
    });

Hãy lưu ý đến chức năng trên ('nhận xét') ở trên. Đúng mã

 $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');

4

điều đó có nghĩa rằng giá trị cho cột project_idtrên bảng commentsbạn đang chèn không chỉ doesn't existvào các dự án bảng NHƯNG cũng project_idcó thể không có giá trị mặc định . Ví dụ: trong trường hợp của tôi, tôi đặt nó là NULL.

Đối với Laravel, bạn có thể coi biểu thức này như một đoạn mã của tệp php di chuyển, ví dụ:

class ForeinToPhotosFromUsers extends Migration

{ /** * Run the migrations. * * @return void */

public function up()
{
    Schema::table('users', function (Blueprint $table) {
    $table->unsignedBigInteger('photo_id')->nullable();// ! ! ! THIS STRING ! ! !
    $table->foreign('photo_id')->references('id')->on('photos');
});
}

}

Rõ ràng là bạn phải tạo lớp Model (trong trường hợp của tôi là Photo) bên cạnh tất cả những thứ này.


3

Bạn cũng gặp lỗi này nếu bạn không tạo và điền các bảng của mình theo đúng thứ tự. Ví dụ, theo sơ đồ của bạn, nhận xét nhu cầu bảng user_id, project_id, task_iddata_type_id. Điều này có nghĩa là Usersbảng, Projectsbảng, Taskbảng và Data_Typebảng phải đã thoát và có các giá trị trong chúng trước khi bạn có thể tham chiếu id của chúng hoặc bất kỳ cột nào khác.

Trong Laravel, điều này có nghĩa là gọi các trình gieo cơ sở dữ liệu của bạn theo đúng thứ tự:

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UserSeeder::class);
        $this->call(ProjectSeeder::class);
        $this->call(TaskSeeder::class);
        $this->call(DataTypeSeeder::class);
        $this->call(CommentSeeder::class);
    }
}

Đây là cách tôi giải quyết một vấn đề tương tự.


2

Trong trường hợp ai đó đang sử dụng Laravel và gặp sự cố này. Tôi cũng nhận được điều này và vấn đề nằm ở thứ tự mà tôi đang chèn id (tức là các khóa ngoại) trong bảng tổng hợp.

Để cụ thể hơn, hãy tìm một ví dụ dưới đây cho mối quan hệ nhiều người:

wordtokens <-> wordtoken_wordchunk <-> wordchunks

// wordtoken_wordchunk table
Schema::create('wordtoken_wordchunk', function(Blueprint $table) {
        $table->integer('wordtoken_id')->unsigned();
        $table->integer('wordchunk_id')->unsigned();

        $table->foreign('wordtoken_id')->references('id')->on('word_tokens')->onDelete('cascade');
        $table->foreign('wordchunk_id')->references('id')->on('wordchunks')->onDelete('cascade');

        $table->primary(['wordtoken_id', 'wordchunk_id']);
    });

// wordchunks table
Schema::create('wordchunks', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->string('text');
    });

// wordtokens table
Schema::create('word_tokens', function (Blueprint $table) {
        $table->increments('id');
        $table->string('text');
});

Bây giờ các mô hình của tôi trông như sau:

class WordToken extends Model
{
   public function wordchunks() {
      return $this->belongsToMany('App\Wordchunk');
   }
}

class Wordchunk extends Model
{

    public function wordTokens() {
        return $this->belongsToMany('App\WordToken', 'wordtoken_wordchunk', 'wordchunk_id', 'wordtoken_id');
    }
}

Tôi đã khắc phục sự cố bằng cách trao đổi thứ tự 'wordchunk_id' và 'wordtoken_id' trong mô hình Wordchunk.

Để hoàn thành mã, đây là cách tôi duy trì các mô hình:

private function persistChunks($chunks) {
    foreach ($chunks as $chunk) {
        $model = new Wordchunk();
        $model->text = implode(' ', array_map(function($token) {return $token->text;}, $chunk));
        $tokenIds = array_map(function($token) {return $token->id;}, $chunk);
        $model->save();
        $model->wordTokens()->attach($tokenIds);
    }
}

2

Có thể bạn có một số hàng trong bảng mà bạn muốn tạo de FK.

Chạy di chuyển với Foreign_key_checks TẮT Chỉ chèn những bản ghi có trường id tương ứng trong bảng nội dung.


1

Tôi gặp sự cố này khi vô tình sử dụng "uuid" SAI trong hồ sơ con của mình. Khi điều đó xảy ra, ràng buộc sẽ tìm từ bản ghi con đến bản ghi mẹ để đảm bảo rằng liên kết là chính xác. Tôi đang tạo nó theo cách thủ công, khi tôi đã thiết bị Model của mình để làm điều đó tự động. Vì vậy, cách khắc phục của tôi là:

$parent = Parent:create($recData); // asssigning autogenerated uuid into $parent

Sau đó, khi tôi gọi lớp con của mình để chèn trẻ, tôi đã chuyển giá trị var này:

$parent->uuid

Hy vọng rằng sẽ giúp.


0

Tôi đã gặp lỗi tương tự, vấn đề là tôi đang cố gắng thêm role_idngoại vào usersbảng, nhưng role_idkhông có giá trị mặc định, vì vậy DB không cho phép tôi chèn cột vì tôi đã có một số người dùng và nó không biết cách thêm cột cho chúng. Vì tôi đang trong giai đoạn phát triển nên tôi mới sử dụng migrate:fresh, nhưng nếu tôi đang sản xuất, tôi có thể sẽ đặt giá trị mặc định thành role_idvà không làm cho nó không bị hạn chế cho đến khi tôi có vai trò tương ứng trên DB.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.