Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Primary Key SQL Tutorial – So definieren Sie einen Primärschlüssel in einer Datenbank

Jede große Geschichte beginnt mit einer Identitätskrise. Luke, der große Jedi-Meister, fängt unsicher an – "Wer bin ich?" - und wie könnte ich jemand Wichtiges sein? Es braucht Yoda, den mit der Macht, um ihm beizubringen, wie man seine Kräfte nutzt.

Lass mich heute dein Yoda sein.

Wir beginnen damit, wie man einen Primärschlüssel auswählt, wie man eine Identitätskrise bekämpft, und enden dann mit Codebeispielen zum Erstellen eines Primärschlüssels in einer Datenbank.

So wählen Sie einen Primärschlüssel aus

Sie denken vielleicht, dass Luke der einzige mit einer Identitätskrise ist, aber das stimmt nicht. Beim Erstellen einer Datenbank befindet sich alles in einer Identitätskrise. Und genau dafür brauchen wir Primärschlüssel:Sie lösen die Krise. Sie sagen uns, wie wir alle finden können.

Stellen Sie sich vor, Sie sind die Regierung und möchten jeden Ihrer Bürger digital identifizieren. Sie erstellen also diese Datenbank mit allem über sie:

First Name
Last Name
Passport Number

Sie wählen die Passnummer als Primary Key – die Identität für alle. Sie denken, das ist alles, was Sie brauchen, da der Pass die Adresse und alles andere enthält. Sie wissen, dass Passnummern einzigartig sind, also haben Sie ein gutes Gefühl und implementieren dieses System.

Dann, ein paar Jahre später, findet man eine hässliche Wahrheit heraus:Das ganze Land steht vor einer Identitätskrise.

Wenn jemandes Reisepass abläuft, bekommt er einen neuen. Ihre Identität ändert sich. Andere Systeme verwenden weiterhin die alten Passnummern, sodass sie jetzt auf Geisterpersonen verweisen.

Einzigartigkeit ist nicht genug. Der Wert darf sich während der gesamten Lebensdauer der Zeile nicht ändern.

Und dann gibt es einige Leute, die nicht einmal einen Pass haben. Sie können sie nicht in Ihr System eingeben, da Primärschlüssel nicht NULL sein können . Wie können Sie jemanden mit einem NULL identifizieren? Schlüssel?

Jede Zeile muss einen Bezeichner haben. NULLen sind nicht erlaubt.

Die nächste Iteration bedeutet, eine Kennung zu finden, die sich im Laufe der Zeit nicht ändert und die jeder hat. In Indien stellt sich heraus, dass dies die Adhaar Card ist. In den USA die Sozialversicherungsnummer.

Wenn Sie eine Datenbank erstellen, machen Sie diese zu Ihren Primärschlüsseln.

Manchmal haben Sie keinen solchen Schlüssel. Stellen Sie sich ein Land vor, das noch keine Sozialversicherungsnummer hat und für jeden Bürger eine digitale Aufzeichnung erstellen möchte. Sie könnten eine neue Sozialversicherungsnummer erstellen oder einfach die Leistungsfähigkeit von Datenbanken nutzen und einen Ersatzschlüssel verwenden.

Ein Ersatzschlüssel hat kein Äquivalent in der realen Welt. Es ist nur eine Zahl in einer Datenbank. Sie haben also diese Tabelle im neuen Land:

userID
First Name
Last Name
Passport Number

Passnummern sind einzigartig. Wann immer Sie die Kennung für einen Benutzer erhalten möchten, können Sie sie über die Passport-Nummer abrufen.

Die Benutzer-ID ändert sich nie. Die Passnummer kann sich ändern – sie ist jedoch immer eindeutig, sodass Sie immer den richtigen Benutzer erhalten. Die Benutzer-ID ist ein Ersatz für eine in diesem Land nicht existierende Sozialversicherungsnummer.

Lustige Tatsache:Die Passnummer hier ist auch ein Kandidatenschlüssel. Es könnte der Primärschlüssel gewesen sein, wenn er sich nie geändert hätte. Dies ist eine geschäftslogische Unterscheidung.

Die wichtigste Erkenntnis lautet:Wenn Sie einen Primärschlüssel auswählen, denken Sie an eine Identitätskrise . Ist es möglich, dass jemand in Zukunft seine Kennung ändert? Können wir in einen Zustand geraten, in dem mehrere Personen dieselbe Kennung haben?

Ich verwende Menschen als Beispiel, weil es die Identität klarer macht – wir wissen, dass jede Person eine Identität haben sollte. Übertragen Sie dieses Denken auf Ihre Datenbanken. Alles hat eine Identität, und genau deshalb brauchen Sie Primärschlüssel.

Hinweis:Manchmal ist es möglich und wünschenswert, mehrere Spalten zusammen als Primärschlüssel zu verwenden. Dies ist ein zusammengesetzter Schlüssel.

Lassen Sie uns nun versuchen, Primärschlüssel mit echten Codebeispielen zu definieren. Hier sind zwei Dinge zu tun:Zuerst identifizieren Sie den Primärschlüssel. Anschließend lernen Sie die Syntax zum Definieren in einer Datenbank kennen.

Ein Beispiel aus der realen Welt

Nehmen wir an, Sie betreiben ein Versand-Startup, ähnlich wie Flexport. Sie haben Pakete, die von einem Ort zum anderen gelangen müssen, und Schiffe, die sie transportieren. Außerdem haben Sie Kunden, die diese Pakete bestellen.

Sie gehen davon aus, dass Sie eine Tabelle für die Kunden, eine für die Pakete und eine für den Transport benötigen, die zeigt, welches Paket sich gerade wo befindet.

Überlegen Sie, welche Spalten Sie benötigen und was der Primärschlüssel sein sollte. Wenn Sie ein Ingenieur bei Flexport wären, müssten Sie sich diese Frage stellen. Nichts ist gegeben, alles wird in der realen Welt entdeckt.

Angesichts dieser Informationen würde ich diese Tabellen wie folgt entwerfen:

Customers: first_name, last_name, email, address (for deliveries to their location)
Packages: weight, content
Transportation: <package_primary_key>, Port, time

Uns fehlen die Primärschlüssel. Denken Sie darüber nach, bevor Sie weiterlesen.

Für das Paket wähle ich einen Ersatz Paket-ID. Ich hätte versuchen können, alle Attribute des Pakets aufzulisten:Gewicht, Volumen, Dichte, Alter. Sie würden das Paket eindeutig identifizieren, aber das ist in der Praxis sehr schwierig. Die Leute kümmern sich nicht darum, sie kümmern sich nur darum, dass das Paket von einem Ort zum anderen gelangt.

Es ist also sinnvoll, eine Zufallszahl zu erstellen und diese als ID zu verwenden. Genau aus diesem Grund verwenden FedEx, UPS und alle Zustelldienste Barcodes und IDs. Dies sind Ersatzschlüssel, die zum Verfolgen von Paketen generiert werden.

Für den Kunden wähle ich einen Ersatz Kundennummer. Auch hier hatte ich die Möglichkeit, beispielsweise die Sozialversicherungsnummer meiner Kunden auszuwählen. Aber Kunden wollen das nicht mit mir teilen, nur damit ich ihnen etwas schicken kann. Wir generieren also intern einen Schlüssel, teilen unseren Kunden diesen Schlüssel nicht mit und nennen ihn weiterhin KundenNr. 345681.

Lustige Geschichte:Ich kenne ein paar Unternehmen, bei denen diese Kundennummer offengelegt wurde, und die Kunden bestanden darauf, dass sie die Nummer 1 bekommen. Es war ziemlich lustig – die Ingenieure mussten tatsächlich ihren Front-End-Code ändern in:if (cust == 345681) print(1);

Für Transport wähle ich ein Komposit Paket-ID+Port+Zeit. Das ist etwas interessanter. Ich hätte einen Ersatz erstellen können hier auch, und es würde genauso gut funktionieren.

Aber hier liegt die Magie der Indizierung. Die Primärschlüssel erhalten automatisch einen Index, was bedeutet, dass die Suche im Vergleich zu Primärschlüsseln viel effizienter ist.

Wenn Sie diese Datenbank durchsuchen, haben die meisten Abfragen die Form „Wo ist dieses Paket?“. Mit anderen Worten, sagen Sie mir angesichts dieser PackageID den Port und die Uhrzeit, an der es sich gerade befindet. Ich würde einen zusätzlichen Index über PackageID benötigen, wenn ich ihn nicht als Teil meines Primärschlüssels habe.

Klingt das gut? Als letzten Schritt definieren wir diese 3 Tabellen in SQL. Die Syntax variiert leicht je nach verwendeter Datenbank.

Primärschlüssel in MySQL definieren

CREATE TABLE customers
( customerID  INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  last_name   VARCHAR(30) NOT NULL,
  first_name  VARCHAR(25) NOT NULL,
  email		  VARCHAR(50) NOT NULL,
  address     VARCHAR(300)
);
CREATE TABLE packages
( packageID  INT(15) NOT NULL AUTO_INCREMENT,
  weight     DECIMAL (10, 2) NOT NULL,
  content    VARCHAR(50),
  CONSTRAINT packages_pk PRIMARY KEY (packageID) # An alternative way to above,
  # when you want to name the constraint as well.
);
CREATE TABLE transportation
( package 	INT(15) NOT NULL,
  port  	INT(15) NOT NULL,
  time	 	DATE NOT NULL,
  
  PRIMARY KEY (package, port, time),
  FOREIGN KEY package
  	REFERENCES packages(packageID)
	ON DELETE RESTRICT    # It's good practice to define what should happen on deletion. In this case, I don't want things to get deleted.

);

Primärschlüssel in PostgreSQL definieren

CREATE TABLE customers
( customerID  SERIAL NOT NULL PRIMARY KEY, # In PostgreSQL SERIAL is same as AUTO_INCREMENT - it adds 1 to every new row.
  last_name   VARCHAR(30) NOT NULL,
  first_name  VARCHAR(25) NOT NULL,
  address     TEXT,
  email		  VARCHAR(50) NOT NULL
);
CREATE TABLE packages
( packageID  SERIAL NOT NULL,
  weight     NUMERIC NOT NULL,
  content    TEXT,
  CONSTRAINT packages_pk PRIMARY KEY (packageID) # In PostgreSQL, this alternative way works too.
);
CREATE TABLE transportation
( package 	INTEGER NOT NULL,
  port  	INT(15) NOT NULL,
  time	 	DATE NOT NULL,
  
  PRIMARY KEY (package, port, time),
  
  FOREIGN KEY package
  	REFERENCES packages(packageID)
	ON DELETE RESTRICT    # It's good practice to define what should happen on deletion. In this case, I don't want things to get deleted.

);

Es ist nicht viel anders, oder? Sobald Sie die Grundlagen beherrschen, können Sie es mit einem kurzen Blick in die Dokumentation auf fast jede Datenbank anwenden. Der Schlüssel ist zu wissen, wonach man suchen muss!

Viel Glück, junger Padawan.

Genossen das? Das könnte Ihnen auch gefallen:Dinge, die ich von einem Senior Software Engineer gelernt habe