Deisigh “a foreign key constraint fails” agus dumpa SQL á iompórtáil

Stopann d'iompórtáil leath bealaigh le Cannot add or update a child row: a foreign key constraint fails. Tá na sonraí ceart go leor — tá an t-ord ina bhfuil na ráitis INSERT mícheart. Seo cén fáth a dtarlaíonn sé agus trí bhealach chun é a dheisiú.

Easpórtálann tú bunachar sonraí, déanann tú iarracht é a lódáil isteach in ásc úrnua, agus caitheann MySQL amach:

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`))

Nó, ar 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".

Cén fáth a dtarlaíonn sé seo

Deir eochair eachtrach “ní mór do gach orders.user_id pointeáil chuig users.id atá ann cheana.” Nuair a chuireann an dumpa orders isteach roimh users, níl an tuismitheoir dá dtagraítear ann fós, agus diúltaíonn an bunachar sonraí don ró.

Scríobhann formhór na n-uirlisí dumpála táblaí in ord aibítre nó in ord cruthaithe — ní in ord spleáchais na n-eochracha eachtracha. Mar sin is minic a thagann orders (leanbh) roimh users (tuismitheoir), agus briseann an iompórtáil.

Deisiú 1: Atheagraigh INSERTanna de réir spleáchais (an deisiú ceart)

Is é an réiteach glan gach tábla tuismitheora a chur isteach roimh a chuid leanaí. Ciallaíonn sé sin na heochracha eachtracha a réiteach ina ngraf spleáchais agus na táblaí a lódáil in ord toipeolaíoch: users → orders → order_items.

Tá sé pianmhar é seo a dhéanamh de láimh i gcomhad il-gigighbeart — caithfidh tú gach FOREIGN KEY a rianú thar ráitis CREATE TABLE agus ALTER TABLE agus bloic ollmhóra INSERT a ghearradh agus a ghreamú san ord ceart.

Deisiú 2: Díchumasaigh seiceálacha eochrach eachtraí le linn iompórtála

I gcás dumpa iomlán atá comhsheasmhach cheana féin, is féidir leat an bailíochtú a scipeáil go sábháilte agus é á lódáil. Ar MySQL, cuir an comhad i bhfilltéar:

-- MySQL
SET FOREIGN_KEY_CHECKS = 0;
-- ... do chuid ráiteas INSERT go léir ...
SET FOREIGN_KEY_CHECKS = 1;

Ar PostgreSQL, cuir na srianta ar athló laistigh d'idirbheart:

-- PostgreSQL
BEGIN;
SET CONSTRAINTS ALL DEFERRED;
-- ... do chuid ráiteas INSERT go léir ...
COMMIT;

Athchumasaigh na seiceálacha ina dhiaidh sin ionas go bhfanfaidh scríbhinní amach anseo bailíochtaithe. Oibríonn sé seo, ach ní chuireann sé ach masc ar an bhfadhb oird — má tá an dumpa páirteach, is féidir go mbeidh rónna dílleachta agat fós.

Deisiú 3: Déan an dá cheann go huathoibríoch le DumpCleaner

Léann DumpCleaner an dumpa, baineann sé gach eochair eachtrach as CREATE TABLE agus ALTER TABLE, tógann sé an graf spleáchais, agus easpórtálann sé comhad glan a iompórtálann gan stró:

  1. Tarraing do dhumpa .sql isteach in DumpCleaner (MySQL, MariaDB, PostgreSQL, SQLite nó MS SQL).
  2. Roghnaigh Ord INSERT → De réir spleáchais (FK-eolach). Cuirtear tuismitheoirí roimh leanaí go huathoibríoch trí shórtáil thoipeolaíoch.
  3. Más mian leat, tic Díchumasaigh seiceálacha eochrach eachtraí — cuireann sé an t-aschur i bhfilltéar leis an ráiteas ceart do do bhunachar sonraí.
  4. Easpórtáil. Iompórtáil an comhad nua — tá an earráid srianta imithe.

Aithníonn sé fiú eochracha eachtracha ciorclacha agus tugann sé rabhadh duit in ionad ord dodhéanta a tháirgeadh.

Deireadh le máinliacht INSERT de láimh

Atheagraíonn DumpCleaner na hionsáití de réir spleáchais eochrach eachtraí ar chomhaid ar bith méide — sruthú, le cuimhne chothrom. Aip dhúchasach macOS & iPadOS, ceannach aon uaire.

Íoslódáil ón App Store

Ceisteanna coitianta

Cén fáth a dtarlaíonn “a foreign key constraint fails” ar iompórtáil?

Tagraíonn ró linbh do ró tuismitheora nár cuireadh isteach fós, toisc go n-ordaíonn an dumpa na INSERTanna in ord aibítre nó de réir ama cruthaithe seachas de réir spleáchais eochrach eachtraí.

An bhfuil sé sábháilte seiceálacha eochrach eachtraí a dhíchumasú le linn iompórtála?

Tá, do dhumpa iomlán comhsheasmhach. Níl tú ach ag scipeáil bailíochtaithe sonraí a bhí bailí cheana féin sa bhunachar sonraí foinseach. Athchumasaigh na seiceálacha ina dhiaidh sin.

Conas a atheagraím INSERTanna gan an comhad a chur in eagar de láimh?

Aithníonn DumpCleaner eochracha eachtracha, tógann sé graf spleáchais, agus easpórtálann sé na INSERTanna in ord toipeolaíoch — ionas go lódálann tuismitheoirí i gcónaí roimh leanaí.

An oibríonn sé seo do PostgreSQL freisin?

Oibríonn. Tacaíonn DumpCleaner le haschur pg_dump agus is féidir leis SET CONSTRAINTS ALL DEFERRED a astú chomh maith le hionsáití atheagraithe de réir spleáchais.

Iompórtáil dumpaí gan an tinneas cinn FK

Tarraing, atheagraigh de réir spleáchais, easpórtáil. Láimhseálann DumpCleaner na heochracha eachtracha ionas go n-oibríonn d'iompórtáil gan stró.

Íoslódáil ón App Store