sql >> Database >  >> RDS >> Mysql

Twee gegenereerde waarden in de leer

Voor zover ik weet is de GeneratedValue-strategie gereserveerd voor de primaire sleutel, wat betekent dat je deze maar één keer per entiteit kunt gebruiken.

Afhankelijk van je behoeften heb je echter een paar opties:

  • U kunt altijd een hebben prePersist levenscyclusgebeurtenis , waarbij u elke gewenste waarde voor de naam instelt voordat u deze de eerste keer aanhoudt.

  • Als u afhankelijk bent van de id om er een andere unieke id van te genereren, kunt u een postPersist-gebeurtenis implementeren, uw naam daar instellen en ervoor zorgen dat u twee keer doorspoelt (de eerste keer om de primaire sleutel te genereren, de tweede keer om de naam op te slaan).

  • Als het goed voor je is dat de naam enige tijd leeg is in de database, kan het goed zijn om een ​​postLoad-gebeurtenis te implementeren, die de naam vult als deze leeg is. Op deze manier ziet uw toepassing altijd de naam (omdat deze wordt geladen uit de database of wordt gevuld door de postLoad-gebeurtenis) en wanneer u de eerste keer na de eerste keer opslaan informatie toevoegt of bewerkt, wordt uw naam ook opgeslagen

  • Het kan goed zijn om de naam niet op te slaan en te laten genereren door een cronjob/deamon/wachtrij, zodat uw toepassing er niet mee te maken heeft. Het enige dat u hoeft te doen, is ervoor zorgen dat een ontbrekende naam niets verpest.

  • Misschien is het oké om een ​​sleutel te genereren die niet afhankelijk is van de primaire sleutel en dus kan worden gegenereerd door een global event handler . Je hebt natuurlijk het nadeel dat zo'n event-handler, omdat hij globaal is, wordt aangeroepen voor elk object dat je aanhoudt, ongeacht of het de juiste entiteit is.

  • Als laatste, maar daarom niet minder belangrijk, is het misschien goed om terug te vallen op Opgeslagen Procedures/Triggers om de database dit te laten afhandelen. Op deze manier hoef je hier niet mee te rommelen in je applicatie. Maar pas op, er kunnen valkuilen onderweg zijn (zoals een ontwikkelaar die dit vergeet omdat het niet in de code staat maar in de database!).

Er kunnen andere manieren zijn. Wat ik probeerde te zeggen is:gebruik generatedValue niet voor niet-primaire sleuteleigenschappen!




  1. Prestatieprobleem met MySQL MyISAM-tabel opnieuw bekeken

  2. Hoe verplaats ik mijn bestaande rails-app naar Heroku? (sqlite naar postgres)

  3. Hoe alle actieve en inactieve orakelsessies voor de gebruiker te doden

  4. MySQL:werk alle rijen in een tabel bij die overeenkomen met de resultaten van een andere zoekopdracht