sql >> Database >  >> RDS >> Database

Kunnen er meerdere primaire sleutels op een enkele tafel bestaan?

  • Wat zijn sleutels?
    • Eenvoudige toetsen
    • Aaneengeschakelde of samengestelde toetsen
    • Primaire toetsen
      • Nummering en automatisch ophogen
  • Kan een tabel meerdere primaire sleutels bevatten?

Hoewel veel ontwikkelaars en databasebeheerders kunnen werken met primary keys elke dag is het een fascinerend onderwerp om jezelf af te vragen:"Wat precies is een primary key en kan (of moet) een databasetabel meerdere primary keys bevatten tegelijkertijd?”

Hieronder zullen we deze vragen in meer detail onderzoeken en proberen te komen tot de redelijke en algemeen overeengekomen consensus binnen de ontwikkelingsgemeenschap.

Wat zijn sleutels?

Om te begrijpen wat een primary key in een databasetabel staat, moeten we eerst een beetje begrijpen over non-primary keys . Een key in een tabel is gewoon een attribuut dat wordt gebruikt om die informatie te identificeren en te openen. Een tabel kan en zal vaak meerdere sleutels hebben, zoals in de tabel Users beide email en username kunnen als sleutels worden beschouwd.

Afhankelijk van de ontwikkelaar of beheerder met wie je spreekt, hoor je misschien over verschillende sleuteltypen en hun definities, dus we zullen hieronder een paar verschillende voorbeelden bespreken en een basisdefinitie van elk.

Eenvoudige toetsen

Een simple key is slechts een sleutel die slechts één enkel kenmerk in de tabel gebruikt. Tenzij we meer beperkingen opleggen aan de sleutel of de tabel, dan is de username attribuut in het bovenstaande voorbeeld is een simple key .

Aaneengeschakelde of samengestelde sleutels

Nog een stap verder dan simple keys zijn concatenated of compound sleutels. Zoals de naam al aangeeft, een concatenated key is een samenvoeging van meerdere single keys . Het systeem kan bijvoorbeeld automatisch de last_name . combineren en year_of_birth single keys in een concatenated key , zoals zo:smith1980 .

Primaire sleutels

Een [primary key](https://en.wikipedia.org/wiki/Unique_key) is een sleutel die is gekozen als de principal (of primary ) representatief attribuut voor die rij gegevens. De primary key is uniek en dat attribuut wordt vervolgens door de hele database gebruikt en wordt geopend en doorgegeven aan andere tabellen als het representatieve attribuut voor de gegevens in kwestie.

In de praktijk zal de primary key attribuut is ook gemarkeerd als NOT NULL in de meeste databases, wat betekent dat het attribuut altijd een waarde moet bevatten om het record in de tabel in te voegen.

Als voorbeeld, ofwel de email of username simple keys zou de aanduiding van de primary key krijgen , maar meestal is het de beste gewoonte om de primary key . in te stellen naar een attribuut dat niet (of niet) kan worden gewijzigd door de bedrijfslogica of zelfs door het individu. Stel je bijvoorbeeld een User . voor krijgt een nieuw e-mailadres, waardoor alle eerdere primary key associaties die zijn gemaakt met het oude e-mailadres worden ongeldig bij gebruik van het nieuwe e-mailadres.

Om deze reden (onder andere) zijn de meeste primary keys gebruik een nummer of unieke tekenreeks, zoals een [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) .

Nummering en automatisch verhogen

Het is ook kort vermeldenswaard dat veel databasesystemen zo zijn opgezet dat elke tabel een primary key heeft. dat is zowel numeriek als automatisch verhoogd. Dit betekent simpelweg dat de database-engine zelf automatisch elk nieuw record in die tabel een unieke primary key toewijst. waarde die stapsgewijs groter is dan alle voorgaande waarden. De meeste ontwikkelaars zijn het er echter over eens dat deze praktijk verouderd is en onnodige beveiligingsfouten blootlegt voor het systeem wanneer het voor sommige wordt gebruikt. tabellen die bepaalde gegevens vertegenwoordigen.

Stel je bijvoorbeeld alle Users . voor records krijgen een automatisch oplopende primary key waarde, bekend als de id attribuut. Als een kwaadwillende ontdekt dat de id attribuut van een bepaalde gebruiker (bijv. John Smith) is de waarde 1500 , dit onthult al een beetje informatie. Ten eerste geeft het aan dat er waarschijnlijk minimaal 1499 andere gebruikers in het systeem zijn, of ooit waren. Het betekent ook dat als de gebruikerspagina van John Smith toegankelijk is via een URL of API-aanroep die die id bevat waarde van 1500 , dan is de kans groot dat je de waarde eenvoudig verandert in een ander getal, zoals 1499 of 1501 , zal de pagina van een andere gebruiker blootleggen die misschien niet wil dat zijn pagina door deze bezoeker wordt geopend. Op deze manier kunnen records worden opgevraagd door simpelweg te gissen de id waarden op massaschaal.

Dit zijn uiteraard zeer eenvoudige voorbeelden, maar om deze redenen zullen de meeste moderne databases een gerandomiseerde en unieke primary key gebruiken. attribuutwaarde zoals een UUID bij het werken met gevoelige gegevens.

Kan een tabel meerdere primaire sleutels bevatten?

Het korte antwoord is nee , een tabel mag niet meerdere primary keys bevatten , omdat dat indruist tegen de fundamentele principes van relationeel databaseontwerp (zie:[database normalisation](https://en.wikipedia.org/wiki/Database_normalisation) en [Third normal form](https://en.wikipedia.org/wiki/Third_normal_form) ).

Het is mogelijk voor een tabel om meerdere candidate keys te hebben , die zich effectief gedragen als een primary key in dat een candidate key is uniek, NOT NULL , en is een enkelvoudige weergave van dat tabelrecord.

Als het echter gaat om het selecteren van welke een attribuut wordt toegewezen als de primary key voor de tabel komt de keuze uit de lijst met alle potentiële candidate keys (vandaar de naam, ze zijn kandidaten om een ​​primary key te worden ). Uiteindelijk slechts één candidate key is geselecteerd als het beste representatieve attribuut voor dat record, om in deze tabel te worden gebruikt als de primary key en waarnaar elders in de database wordt verwezen door andere tabellen via hun respectievelijke foreign keys .


  1. Oracle DBA-mentor

  2. mysql -> invoegen in tbl (selecteer uit een andere tabel) en enkele standaardwaarden

  3. Hoe een variabele in te stellen vanuit een SQL-query?

  4. Gebruik COLUMNPROPERTY() om kolom- of parameterinformatie in SQL Server te retourneren