sql >> Databasteknik >  >> RDS >> Sqlserver

Dubbelriktad främmande nyckel-begränsning

"Jag tror att detta är omöjligt. Du kan inte skapa en adresspost förrän du känner till personens ID och du kan inte infoga personposten förrän du känner till ett adress-ID för fältet PrimaryAddressId."

På ytan verkar det påståendet SÅ tilltalande. Det är dock ganska propostous.

Detta är ett mycket vanligt problem som SQL DBMS-leverantörerna har försökt attackera i kanske decennier redan.

Nyckeln är att all kontroll av begränsningar måste "skjutas upp" tills båda insättningarna är klara. Det kan uppnås under olika former. Databastransaktioner kan erbjuda möjligheten att göra något som "STÄLL PÅ uppskjuten begränsningskontroll", och du är klar (om det inte vore för det faktum att du i det här exemplet förmodligen skulle behöva bråka väldigt hårt med din design för att för att bara kunna DEFINIERA de två FK-begränsningarna, eftersom en av dem helt enkelt INTE ÄR en "sann" FK i SQL-bemärkelse!).

Triggerbaserade lösningar som beskrivs här uppnår i princip samma effekt, men de är utsatta för alla underhållsproblem som finns med applikationspåtvingad integritet.

I sitt arbete beskriver Chris Date &Hugh Darwen vad som är den sanna lösningen på problemet:flera uppdrag. Det är, i huvudsak, möjligheten att komponera flera distinkta uppdateringssatser och få DBMS att agera på det som om det vore en enda sats. Implementeringar av det konceptet finns, men du kommer inte att hitta några som talar SQL.



  1. Skicka en array av strängar till en procedur och använda den i WHERE-satsen med IN

  2. Välj värden mellan startdatum och slutdatum

  3. MySQL Välj både detta och det

  4. Hur frågar man efter många till många relationer?