Irranġa "a foreign key constraint fails" meta timporta SQL dump

L-import tiegħek jieqaf f'nofsu bi Cannot add or update a child row: a foreign key constraint fails. Id-data hija tajba — l-ordni tad-dikjarazzjonijiet INSERT hija ħażina. Hawn għaliex jiġri u tliet modi kif tirranġah.

Tesporta database, tipprova ttella' f'istanza friska, u MySQL jitfa':

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`app`.`orders`, CONSTRAINT `orders_user_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`))

Jew, fuq PostgreSQL:

ERROR: insert or update on table "orders" violates foreign key constraint "orders_user_id_fkey"
DETAIL: Key (user_id)=(42) is not present in table "users".

Għaliex jiġri dan

Foreign key tgħid “kull orders.user_id irid jindika lejn users.id eżistenti.” Meta d-dump idaħħal orders qabel users, ir-ringiela ġenitur imsemmija għadha ma teżistix, u d-database jirrifjuta r-ringiela.

Il-biċċa l-kbira tal-għodod tad-dump jiktbu t-tabelli b'ordni alfabetiku jew fl-ordni tal-ħolqien — mhux fl-ordni tad-dipendenza tal-foreign key. Għalhekk orders (ibna) ta' spiss jaqa' qabel users (ġenitur), u l-import jinkiser.

Soluzzjoni 1: Erġa' organizza l-INSERTs skont id-dipendenza (is-soluzzjoni korretta)

Is-soluzzjoni nadifa hija li ddaħħal kull tabella ġenitur qabel it-tfal tagħha. Dan ifisser li tirriżolvi l-foreign keys fi graph ta' dipendenza u ttella' t-tabelli f'ordni topoloġiku: users → orders → order_items.

Li tagħmel dan bl-idejn f'fajl ta' bosta gigabytes huwa ta' wġigħ — trid issegwi kull FOREIGN KEY fost id-dikjarazzjonijiet CREATE TABLE u ALTER TABLE u taqta'/tikkopja blokki kbar ta' INSERT fis-sekwenza t-tajba.

Soluzzjoni 2: Iddiżattiva l-foreign key checks waqt l-import

Għal dump komplet u diġà konsistenti tista' bla periklu taqbeż il-validazzjoni waqt li ttella'. Fuq MySQL, iddawwar il-fajl:

-- MySQL
SET FOREIGN_KEY_CHECKS = 0;
-- ... id-dikjarazzjonijiet INSERT kollha tiegħek ...
SET FOREIGN_KEY_CHECKS = 1;

Fuq PostgreSQL, iddifferixxi l-constraints ġewwa transazzjoni:

-- PostgreSQL
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
-- ... id-dikjarazzjonijiet INSERT kollha tiegħek ...
COMMIT;

Erġa' attiva l-checks wara biex il-kitbiet futuri jibqgħu validati. Dan jaħdem, imma jaħbi biss il-problema tal-ordni — jekk id-dump huwa parzjali, xorta tista' tispiċċa b'ringieli orfni.

Soluzzjoni 3: Agħmel it-tnejn awtomatikament b'DumpCleaner

DumpCleaner jaqra d-dump, jestratti kull foreign key minn CREATE TABLE u ALTER TABLE, jibni l-graph tad-dipendenza, u jesporta fajl nadif li sempliċiment jimporta:

  1. Iġbed id-dump .sql tiegħek ġo DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite jew MS SQL).
  2. Agħżel Ordni tal-INSERT → Skont id-dipendenzi (FK-aware). Il-ġenituri jitqiegħdu qabel it-tfal awtomatikament permezz ta' topological sort.
  3. Fakultattivament immarka Iddiżattiva l-foreign key checks — idawwar l-output bid-dikjarazzjoni korretta għad-database tiegħek.
  4. Esporta. Importa l-fajl il-ġdid — l-iżball tal-constraint sparixxa.

Saħansitra jinnota foreign keys ċirkulari u jwissik minflok ma jipproduċi ordni impossibbli.

Aktar l-ebda kirurġija manwali tal-INSERT

DumpCleaner jerġa' jorganizza l-inserts skont id-dipendenza tal-foreign key fuq fajls ta' kwalunkwe daqs — bi streaming, b'memorja kostanti. App nattiva għal macOS & iPadOS, xiri ta' darba.

Niżżel mill-App Store

Mistoqsijiet frekwenti

Għaliex jiġri “a foreign key constraint fails” fl-import?

Ringiela ibna tirreferi għal ringiela ġenitur li għadha ma ddaħħlitx, għax id-dump jorganizza l-INSERTs b'ordni alfabetiku jew skont il-ħin tal-ħolqien minflok skont id-dipendenza tal-foreign key.

Huwa sikur li tiddiżattiva l-foreign key checks waqt l-import?

Iva, għal dump sħiħ u konsistenti. Qed taqbeż biss il-validazzjoni ta' data li kienet diġà valida fid-database tas-sors. Erġa' attiva l-checks wara.

Kif nista' nerġa' norganizza l-INSERTs mingħajr ma neditja l-fajl bl-idejn?

DumpCleaner jinnota l-foreign keys, jibni graph ta' dipendenza, u jesporta l-INSERTs f'ordni topoloġiku — biex il-ġenituri dejjem jitgħabbew qabel it-tfal.

Dan jaħdem għal PostgreSQL ukoll?

Iva. DumpCleaner jappoġġa l-output ta' pg_dump u jista' joħroġ SET CONSTRAINTS ALL DEFERRED kif ukoll inserts organizzati skont id-dipendenza.

Importa d-dumps mingħajr l-uġigħ ta' ras tal-FK

Iġbed, erġa' organizza skont id-dipendenzi, esporta. DumpCleaner jieħu ħsieb il-foreign keys biex l-import tiegħek sempliċiment jaħdem.

Niżżel mill-App Store