ERROR 1452: Tidak dapat menambah atau memperbarui baris anak: batasan kunci asing gagal

132

Saya telah membuat tabel di MySQL Workbench seperti yang ditunjukkan di bawah ini:

Tabel ORDRE:

CREATE TABLE Ordre (
  OrdreID   INT NOT NULL,
  OrdreDato DATE DEFAULT NULL,
  KundeID   INT  DEFAULT NULL,
  CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
  CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
  ENGINE = InnoDB;

Tabel PRODUKT:

CREATE TABLE Produkt (
  ProduktID          INT NOT NULL,
  ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
  ProduktFarge       VARCHAR(20)  DEFAULT NULL,
  Enhetpris          INT          DEFAULT NULL,
  CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
  ENGINE = InnoDB;

dan tabel ORDRELINJE:

CREATE TABLE Ordrelinje (
  Ordre         INT NOT NULL,
  Produkt       INT NOT NULL,
  AntallBestilt INT DEFAULT NULL,
  CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
  CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
  CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
  ENGINE = InnoDB;

jadi ketika saya mencoba memasukkan nilai ke dalam ORDRELINJEtabel saya mendapatkan:

Kode Kesalahan: 1452. Tidak dapat menambah atau memperbarui baris anak: batasan kunci asing gagal ( srdjank. Ordrelinje, CONSTRAINT Ordrelinje_fkFOREIGN KEY ( Ordre) REFERENSI Ordre( OrdreID))

Saya telah melihat posting lain tentang topik ini, tetapi tidak berhasil. Apakah saya mengawasi sesuatu atau tahu apa yang harus saya lakukan?

pengguna3289677
sumber

Jawaban:

172

Diambil dari Using FOREIGN KEY Constraints

Hubungan kunci asing melibatkan tabel induk yang menyimpan nilai data pusat, dan tabel anak dengan nilai identik yang menunjuk kembali ke induknya. Klausa FOREIGN KEY ditentukan dalam tabel anak.

Ini akan menolak setiap operasi INSERT atau UPDATE yang mencoba untuk membuat nilai kunci asing dalam tabel anak jika tidak ada nilai kunci kandidat yang cocok dalam tabel induk.

Jadi kesalahan Anda Error Code: 1452. Cannot add or update a child row: a foreign key constraint failspada dasarnya berarti bahwa, Anda mencoba menambahkan baris ke Ordrelinjetabel Anda yang tidak ada baris yang cocok (OrderID) yang ada dalam Ordretabel.

Anda harus memasukkan baris ke Ordretabel Anda terlebih dahulu .

Rahul
sumber
Atau bisakah kita menjatuhkan kunci asing kemudian menambahkan kunci asing setelah penyisipan data?
Vamsi Pavan Mahesh
@VamsiPavanMahesh, TIDAK, karena meskipun Anda melakukan itu; pembuatan kunci luar Anda akan gagal dengan jenis kesalahan yang sama karena akan ada ketidakcocokan data kunci.
Rahul
4
Sederhananya jika anak-anak memiliki id orang tua yang ditentukan, orang tua ini harus ada. Dan saya pikir sintaks saya salah ... Itu sangat membantu saya. Terima kasih!
wst
2
Bagaimana dengan hubungan opsional?
Hamed Hamedi
40

Anda mendapatkan pemeriksaan batasan ini karena Ordretabel tidak memiliki referensi yang OrdreIDdisediakan dalam perintah sisipkan.

Untuk memasukkan nilai Ordrelinje, Anda harus terlebih dahulu memasukkan nilai dalam Ordretabel dan menggunakan nilai yang sama OrdreIDdalam Orderlinjetabel.

Atau Anda tidak dapat menghapus batasan tidak null dan memasukkan nilai NULL di dalamnya.

Ankit Bansal
sumber
29

Anda harus menghapus data di tabel anak yang tidak memiliki nilai kunci asing yang sesuai dengan kunci utama tabel induk. Atau hapus semua data dari tabel anak lalu masukkan data baru yang memiliki nilai kunci asing yang sama dengan kunci utama di tabel induk . Seharusnya itu berhasil. Berikut juga video youtube

Humphrey
sumber
1
Ini benar, sebelum memasukkan data ke dalam tabel pivot (yang memiliki batasan CASCADE), Anda harus memasukkan data ke dalam tabel induk. misalnya tabel 1 - izin; Tabel ke-2 - peran; Tabel ke-3 - permission_role; Jadi, masukkan pertama ke dalam tabel izin, masukkan ke-2 ke tabel peran dan terakhir masukkan ke tabel izin_rol.
Deepak Panwar
25

Masalahnya adalah dengan Batasan KUNCI ASING. Secara Default (SET FOREIGN_KEY_CHECKS = 1). Opsi FOREIGN_KEY_CHECKS menentukan apakah akan memeriksa batasan kunci asing untuk tabel InnoDB atau tidak. MySQL - SETEL FOREIGN_KEY_CHECKS

Kita dapat mengatur pemeriksaan kunci asing sebagai nonaktif sebelum menjalankan Query. Nonaktifkan kunci Asing .

Jalankan salah satu baris ini sebelum menjalankan kueri Anda, lalu Anda dapat menjalankan kueri Anda dengan sukses. :)

1) Untuk Sesi (disarankan)

SET FOREIGN_KEY_CHECKS=0;

2) Secara global

SET GLOBAL FOREIGN_KEY_CHECKS=0;
Tuan-Faizan
sumber
19

Kesalahan ini umumnya terjadi karena kita memiliki beberapa nilai di bidang referensi tabel anak, yang tidak ada di bidang referensi / kandidat dari tabel induk.

Terkadang, kita mungkin mendapatkan kesalahan ini ketika kita menerapkan batasan Kunci Asing ke tabel yang ada, yang sudah memiliki data di dalamnya . Beberapa jawaban lain menyarankan untuk menghapus data sepenuhnya dari tabel anak, dan kemudian menerapkan batasannya. Namun, ini bukan pilihan ketika kita sudah memiliki data kerja / produksi di tabel anak. Dalam sebagian besar skenario, kita perlu memperbarui data di tabel anak (daripada menghapusnya).

Sekarang, kita dapat memanfaatkan Left Joinuntuk menemukan semua baris tersebut di tabel anak, yang tidak memiliki nilai yang cocok di tabel induk. Kueri berikut akan membantu untuk mengambil baris yang tidak cocok tersebut:

SELECT child_table.* 
FROM child_table 
LEFT JOIN parent_table 
  ON parent_table.referenced_column = child_table.referencing_column 
WHERE parent_table.referenced_column IS NULL

Sekarang, biasanya Anda dapat melakukan satu (atau lebih) langkah-langkah berikut untuk memperbaiki data.

  1. Berdasarkan "logika bisnis" Anda, Anda perlu memperbarui / mencocokkan nilai yang tidak cocok ini, dengan nilai yang ada di tabel induk. Terkadang Anda mungkin perlu mengaturnya nulljuga.
  2. Hapus baris ini yang memiliki nilai yang tidak cocok.
  3. Tambahkan baris baru di tabel induk Anda, sesuai dengan nilai yang tidak cocok di tabel anak.

Setelah data diperbaiki, kita dapat menerapkan batasan kunci Asing menggunakan ALTER TABLEsintaks.

Madhur Bhaiya
sumber
Saya menghapus semua data dari tabel dan kemudian menambahkan kunci asing itu telah ditambahkan terima kasih
Sumit Kumar Gupta
4

pada tabel foreign key memiliki nilai yang tidak dimiliki pada tabel primary key yang akan di kaitkan, jadi anda harus menghapus semua data terlebih dahulu / menyesuaikan nilai tabel foreign key anda sesuai dengan nilai yang ada di primary key anda

Arbahud Rio Daroyni
sumber
3

Saya mendapatkan masalah ini meskipun tabel induk saya memiliki semua nilai yang saya rujuk di tabel anak saya. Masalahnya sepertinya saya tidak dapat menambahkan beberapa referensi turunan ke satu kunci asing. Dengan kata lain, jika saya memiliki lima baris data yang mereferensikan kunci asing yang sama, MySQL hanya mengizinkan saya untuk mengunggah baris pertama dan memberi saya kesalahan 1452.

Yang berhasil bagi saya adalah mengetik kode "SET GLOBAL FOREIGN_KEY_CHECKS = 0". Setelah itu saya menutup MySQL dan kemudian memulainya kembali dan saya dapat mengunggah semua data saya tanpa kesalahan. Saya kemudian mengetik "SET GLOBAL FOREIGN_KEY_CHECKS = 1" untuk mengatur kembali sistem ke normal meskipun saya tidak sepenuhnya yakin apa yang dilakukan FOREIGN_KEY_CHECKS. Semoga ini membantu!

Matt Mcketty
sumber
Bukankah ini yang sudah disarankan dalam jawaban yang diposting oleh @ Mr-Faizan? Jika tidak, jelaskan apa yang ditambahkan oleh jawaban Anda.
Adrian Mole
2

Ini bisa diperbaiki dengan memasukkan record masing-masing di tabel Parent terlebih dahulu dan kemudian kita bisa memasukkan record ke kolom masing-masing tabel Anak. Periksa juga tipe data dan ukuran kolomnya. Ini harus sama dengan kolom tabel induk, bahkan mesin dan pemeriksaannya juga harus sama. COBA INI! Beginilah cara saya memecahkan masalah saya. Koreksi saya jika salah.

frz
sumber
1

ORDRELINJETabel Anda ditautkan dengan ORDERtabel menggunakan batasan kunci asing yang constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)sesuai dengan Ordre int NOT NULL,kolom tabel mana yang ORDRELINJEharus cocok dengan Ordre int NOT NULL,kolom ORDERtabel mana pun.

Sekarang yang terjadi di sini adalah, saat Anda memasukkan baris baru ke dalam ORDRELINJEtabel, menurut batasan fk Ordrelinje_fkitu memeriksa ORDERtabel jikaOrdreID ada atau tidak dan karena tidak cocok dengan OrderId, Compiler mengeluh karena pelanggaran kunci asing. Inilah alasan Anda mendapatkan kesalahan ini.

Kunci asing adalah kunci utama dari tabel lain yang Anda gunakan di tabel mana pun untuk menghubungkan keduanya. Kunci ini terikat oleh batasan kunci asing yang Anda tentukan saat membuat tabel. Operasi apa pun pada data tidak boleh melanggar batasan ini. Pelanggaran batasan ini dapat mengakibatkan kesalahan seperti ini.

Harap saya jelaskan.

Saket Choubey
sumber
1

Saat memasukkan nilai atribut kunci asing, pertama verifikasi jenis atribut, serta nilai atribut kunci utama dalam relasi induk, jika nilai dalam relasi induk cocok, maka Anda dapat dengan mudah memasukkan / memperbarui nilai atribut anak.

ashok
sumber
1

sebaiknya tambahkan data dari REFERENCES KEY di PRIMARY TABLE ke FOREIGN KEY di CHILD TABLE
artinya jangan tambahkan data acak ke foreign key ، gunakan saja data dari primary key yang bisa diakses

deskripsi data dalam kunci asing

mamal
sumber
1

Ini membantu saya setelah membaca @ Mr-Faizan dan jawaban lainnya.

Hapus centang 'Aktifkan pemeriksaan kunci asing'

di phpMyAdmin dan tekan kueri. Saya tidak tahu tentang WorkBench tetapi jawaban lain mungkin membantu Anda.

Sagar Wankhede
sumber
0

Anda harus memasukkan setidaknya satu mentah di setiap tabel (yang Anda ingin kunci asing tunjuk) kemudian Anda dapat memasukkan atau memperbarui nilai-nilai kunci asing

Harvester Haidar
sumber
0

sakit memeras ini di sini: kasus saya mencoba untuk membuat seperti untuk posting yang tidak ada; saat melakukan ke database kesalahan itu muncul. solusinya adalah dengan membuat postingan terlebih dahulu lalu menyukainya. dari pemahaman saya jika post_id akan disimpan di tabel suka harus dicek terlebih dahulu dengan tabel posting untuk memastikan keberadaannya. Saya merasa lebih baik melakukannya dengan cara ini karena menurut saya lebih logis ..

Pytbyte
sumber
0

Saat Anda menggunakan kunci asing , urutan kolom Anda harus sama untuk penyisipan .

Misalnya, jika Anda menambahkan (userid, password)di table1 dari table2 kemudian dari table2 agar harus sama (userid, password)dan tidak seperti (password,userid) di mana useridmerupakan kunci asing di table2 dari table1 .

Kishan Solanki
sumber
0

Masalah terjadi karena Anda menyetel kunci asing di tabel anak setelah Anda memasukkan beberapa data di tabel anak.

Coba hapus semua data dari tabel anak, kemudian atur kunci asing dan kemudian tambahkan / masukkan data ke dalam tabel, itu akan berfungsi.

Khalid Teli
sumber
0

periksa no. dari record pada tabel induk yang sesuai dengan tabel anak dan juga primary key harus sesuai dengan referensi foreign key. Ini berhasil untuk saya.

Upkar
sumber
-4

100% bekerja ...

ERROR 1452: Tidak dapat menambah atau memperbarui baris anak: batasan kunci asing gagal .... jika jenis kesalahan ini terjadi: maka Pertama-tama buka tabel ini dan periksa pengaturan> jika Mesin adalah: InnoDB kemudian ubah ke MyISAM

(dan hapus batasan asing referensi)

kundan chauhan_KP
sumber