Kada naudoti „ON UPDATE CASCADE“

Reguliariai naudoju „ON DELETE CASCADE“, bet aš niekada nenaudoju „ON UPDATE CASCADE“, nes nesu įsitikinęs, kokia situacija bus naudinga.

Aptarkite keletą kodų.

 CREATE TABLE parent ( id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id) ); CREATE TABLE child ( id INT NOT NULL AUTO_INCREMENT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ); 

„ON DELETE CASCADE“, jei ištrinamas tėvas su id , vaiko elemento įrašas su parent_id = parent.id bus automatiškai ištrintas. Tai neturėtų būti problema.

  • Ar tai reiškia, kad „ON UPDATE CASCADE“ atliks tą patį, kai tėvų id atnaujinamas?

  • Jei (1) yra teisinga, tai reiškia, kad nereikia naudoti „ON UPDATE CASCADE“, jei parent.id nėra atnaujinamas (arba niekada atnaujintas), pavyzdžiui, kai jis yra AUTO_INCREMENT arba visada TIMESTAMP reikšmė. Ar tai teisinga?

  • Jei (2) yra neteisinga, kokioje kitoje situacijoje turėtume naudoti „ON UPDATE CASCADE“?

  • Ką daryti, jei aš (dėl kokių nors priežasčių) atnaujinu child.parent_id , kad neegzistuotų, ar jis bus automatiškai ištrintas?

Na, aš žinau, kad kai kurie iš pirmiau minėtų klausimų gali būti suprantami programiniu požiūriu, bet aš taip pat noriu žinoti, ar bet kuris iš šių duomenų bazių teikėjų priklauso ar ne.

Apšvieskite šviesą.

303
26 сент. NawaMan nustatė rugsėjo 26 d. 2009-09-26 18:41 '09 18:41 2009-09-26 18:41
@ 6 atsakymai

Tiesa, kad jei jūsų pirminis raktas yra tik vertė, kuri automatiškai padidinama, nenaudosite, jei norite naudoti „ON UPDATE CASCADE“.

Tačiau, tarkim, jūsų pagrindinis raktas yra 10 skaitmenų UPC brūkšninis kodas ir dėl plėtinio turite pakeisti jį į 13 skaitmenų UPC brūkšninį kodą. Tokiu atveju, ON UPDATE CASCADE leis jums pakeisti pirminio rakto vertę, o visos lentelės, kuriose yra nuorodų į užsienio raktus, bus atitinkamai pakeistos.

Kalbant apie # 4, jei pakeisite vaiko ID į kažką, kuri nėra pagrindinėje lentelėje (ir jūs turite nuorodos vientisumą), turėtumėte gauti užsienio klaidos klaidą.

343
26 сент. atsakymą pateikė C-Pound Guru 26 sep. 2009-09-26 19:01 '09 19:01 2009-09-26 19:01

Susiję klausimai


Susiję klausimai

  • Taip, tai reiškia, kad, pvz., Jei atliksite UPDATE parent SET id = 20 WHERE id = 10 , visi tėvai_id iš 10 vaikų taip pat bus atnaujinti iki 20

  • Jei neatnaujinsite lauko, kurį nurodo užsienio raktas, šis parametras nereikalingas.

  • Jūs negalite galvoti apie kitus naudojimo būdus.

  • Jūs negalite to padaryti, nes užsienio raktų suvaržymas nepavyks.

61
26 сент. atsakymas pateikiamas Zed 26 sep. 2009-09-26 19:03 '09 19:03 2009-09-26 19:03

Manau, kad jūs beveik pridedate taškus!

Jei laikotės duomenų bazės projektavimo gairių ir jūsų pagrindinis raktas niekada nebus atnaujintas (kuris, manau, visada turėtų būti), tuomet nereikia ON UPDATE CASCADE .

„Zed“ padarė gerą išvadą, kad jei naudosite natūralų raktą kaip pagrindinį raktą (pvz., Įprastą lauką iš duomenų bazės lentelės), tada gali atsirasti situacijų, kai reikia atnaujinti pagrindinius raktus. Kitas naujausias pavyzdys yra ISBN (tarptautiniai standartiniai knygų numeriai), kurie neseniai pasikeitė nuo 10 iki 13 skaitmenų + simbolių.

Taip nėra, jei nuspręsite naudoti raktinį raktą (pavyzdžiui, dirbtinai sukurtą sistemą) kaip pagrindinį raktą (kuris būtų mano pageidaujamas pasirinkimas visuose, išskyrus rečiuosius atvejus).

Taigi, galų gale: jei jūsų pirminis raktas niekada nepasikeis, niekada nereikia „ ON UPDATE CASCADE punkto.

Pažymėti

19
26 сент. atsakymas pateikiamas 26 sek . 2009-09-26 19:45 '09 19:45 2009-09-26 19:45

Prieš kelias dienas susidūriau su problemomis, ir supratau, kad „ ON UPDATE CASCADE gali būti naudinga. Pažvelkite į šį pavyzdį (PostgreSQL):

 CREATE TABLE club ( key SERIAL PRIMARY KEY, name TEXT UNIQUE ); CREATE TABLE band ( key SERIAL PRIMARY KEY, name TEXT UNIQUE ); CREATE TABLE concert ( key SERIAL PRIMARY KEY, club_name TEXT REFERENCES club(name) ON UPDATE CASCADE, band_name TEXT REFERENCES band(name) ON UPDATE CASCADE, concert_date DATE ); 

Mano problemoje turėjau apibrėžti papildomas operacijas (trigerius), kad atnaujintumėte koncertų lentelę. Šios operacijos turėjo pakeisti grupės pavadinimą ir grupės pavadinimą. Dėl nuorodos negalėjau to padaryti. Negalėjau pakeisti koncerto ir tada dalyvauti klubų ir grupių lentelėse. Aš taip pat negalėjau to daryti kitaip. ON UPDATE CASCADE buvo raktas į problemos sprendimą.

10
09 янв. atsakymą pateikė Ariel Grabijas 09 jan. 2013-01-09 18:02 '13, 18:02, 2013-01-09 18:02

Mano komentaras iš esmės yra susijęs su 3 punktu: Kokiomis aplinkybėmis yra įjungta atnaujinti CASCADE, jei manome, kad pagrindinis raktas nėra atnaujinamas? Čia yra vienas atvejis.

Aš sprendžiu replikacijos scenarijų, kuriame turi būti derinamos kelios palydovinės duomenų bazės su kapitonu. Kiekvienas palydovas generuoja duomenis tose pačiose lentelėse, todėl stalų sujungimas su magistraliu pažeidžia unikalius suvaržymus. Stengiuosi naudoti „ON UPDATE CASCADE“ kaip dalį sprendimo, kuriame kiekvieną susijungimą dar kartą padidinu raktus. ON UPDATE CASCADE turėtų supaprastinti šį procesą automatizuodama dalį proceso.

4
20 сент. atsakymas pateikiamas ted.strauss 20 sep . 2012-09-20 21:15 '12 21:15 2012-09-20 21:15

Tai puikus klausimas, vakar vakar turėjau tą patį klausimą. Aš galvojau apie šią problemą, ypač SEARCH, jei yra kažkas panašaus į „ON UPDATE CASCADE“, ir, laimei, SQL kūrėjai taip pat galvojo apie tai. Sutinku su Ted.strauss, ir aš taip pat komentavau apie „Noran“ atvejį.

Kada aš jį naudoju? Kaip pažymėjo Tedas, kai apdorojate keletą duomenų bazių vienu metu, o vieno iš jų pakeitimai vienoje lentelėje yra tam tikros rūšies atkūrimas toje, ką Ted ragina, „palydovinė duomenų bazė“ negali būti išsaugota su labai originaliu ID, ir dėl kokių nors priežasčių turite sukurti naują, jei negalite atnaujinti senojo duomenų (pvz., dėl leidimų arba jei ieškote stabilumo tokiu atveju, kuris yra toks trumpalaikis, kad nenusipelno visiško ir visiško bendrųjų taisyklių laikymosi) normalizavimas tiesiog dėl to, kad udet labai trumpalaikis naudingumas)

Taigi, aš sutinku dviem punktais:

(A). Taip, daugeliu atvejų geriausias dizainas gali tai išvengti; BET

(B.) Persikėlimo, duomenų bazės atkūrimo ar reagavimo į ekstremalias situacijas atvejais tai yra didelis įrankis, kuris, laimei, ten buvo, kai nuėjau ieškoti, jei jis yra.

3
12 июня '14 в 15:44 2014-06-12 15:44 Atsakymą davė Davidas L birželio 12 d. 14 val. 2014-06-12 15:44

Žr. Kitus klausimus, susijusius su arba Užduokite klausimą