sql >> Database >  >> RDS >> Sqlserver

Bidirectionele externe sleutelbeperking

"Ik geloof dat dit onmogelijk is. U kunt pas een adresrecord maken als u de ID van de persoon kent en u kunt de persoonsrecord pas invoegen als u een AddressId voor het veld PrimaryAddressId weet."

Op het eerste gezicht lijkt die claim ZO aantrekkelijk. Het is echter nogal proposteus.

Dit is een veel voorkomend soort probleem dat de SQL DBMS-leveranciers al tientallen jaren proberen aan te vallen.

De sleutel is dat alle controle op beperkingen moet worden "uitgesteld" totdat beide invoegingen zijn voltooid. Dat kan onder verschillende vormen. Databasetransacties bieden mogelijk de mogelijkheid om iets te doen als "STEL de uitgestelde beperkingscontrole in op AAN", en u bent klaar ( ware het niet dat u in dit specifieke voorbeeld heel hard zou moeten knoeien met uw ontwerp om om gewoon de twee FK-beperkingen te kunnen DEFINIREN, omdat een van hen gewoon GEEN 'echte' FK IS in de SQL-zin!).

Op triggers gebaseerde oplossingen, zoals hier beschreven, bereiken in wezen hetzelfde effect, maar deze worden blootgesteld aan alle onderhoudsproblemen die bestaan ​​met door de toepassing afgedwongen integriteit.

In hun werk beschrijven Chris Date &Hugh Darwen wat imo de echte oplossing voor het probleem is:meervoudige toewijzing. Dat is in wezen de mogelijkheid om verschillende afzonderlijke update-instructies samen te stellen en het DBMS ernaar te laten handelen alsof dat één enkele instructie is. Er bestaan ​​implementaties van dat concept, maar je zult er geen vinden die SQL spreekt.



  1. fiscaal jaar berekenen in sql select-verklaring?

  2. kan geen verbinding maken met mysql op AWS RDS (fout 2003)

  3. GET-parameters kwetsbaar voor SQL-injectie - PHP

  4. MySQL stoppen/starten met MySQL Workbench