Det är allmänt överens om att primärnycklar ska vara oföränderliga (eller så stabila som möjligt eftersom oföränderlighet inte kan tillämpas i DB). Även om det inte finns något som hindrar dig från att uppdatera en primärnyckel (förutom integritetsbegränsning), kanske det inte är en bra idé:
Ur prestationssynpunkt:
- Du måste uppdatera alla främmande nycklar som refererar till den uppdaterade nyckeln. En enda uppdatering kan leda till uppdatering av potentiellt många tabeller/rader.
- Om de främmande nycklarna är oindexerade (!!) måste du ha ett lås på barnbordet för att säkerställa integriteten. Oracle kommer bara att hålla låset en kort stund men det här är ändå skrämmande.
- Om dina främmande nycklar är indexerade (som de borde vara), kommer uppdateringen att leda till uppdatering av indexet (delete+insert i indexstrukturen), detta är i allmänhet dyrare än själva uppdateringen av bastabellen.
- I ORGANISATION INDEX-tabeller (i andra RDBMS, se klustrade primärnyckel) sorteras raderna fysiskt efter primärnyckeln. En logisk uppdatering kommer att resultera i en fysisk radering+infogning (dyrare)
Andra överväganden:
- Om denna nyckel refereras till i något externt system (applikationscache, en annan DB, export...), kommer referensen att brytas vid uppdatering.
- Dessutom stöder vissa RDBMS inte CASCADE UPDATE, särskilt Oracle.
Sammanfattningsvis, under design är det i allmänhet säkrare att använda en surrogatnyckel i stället för en naturlig primärnyckel som inte ska ändras -- men som så småningom kan behöva uppdateras på grund av ändrade krav eller till och med datainmatningsfel.
Om du absolut måste uppdatera en primärnyckel med barntabell, se det här inlägget av Tom Kyte för en lösning.