it-swarm.com.de

Kann ich VARCHAR als PRIMARY KEY verwenden?

Ich habe eine Tabelle zum Speichern von Gutscheinen/Rabatten, und ich möchte die coupon_code-Spalte als Primärschlüssel verwenden, der eine VARCHAR ist.

Mein Grund ist, dass jeder Gutschein einen eindeutigen Code hat, und die einzigen Befehle, die ich ausführen werde, sind SELECT ... FROM ... WHERE coupon_code='..'

Ich werde keine Verknüpfungen oder Indizierungen vornehmen, und es werden nicht mehr als ein paar hundert Einträge in dieser Tabelle angezeigt.

Es scheint mir, dass dies in Ordnung sein wird, aber ich weiß nicht, ob es etwas gibt, was mir fehlt oder an das ich nicht denke.

41
Mike Brady

Natürlich können Sie dies in dem Sinne, dass Ihr RDBMS es Ihnen ermöglicht. Die Antwort auf die Frage, ob Sie sollten tun, ist jedoch unterschiedlich: In den meisten Situationen sollten Werte, die außerhalb Ihres Datenbanksystems eine Bedeutung haben, nicht als Primärschlüssel ausgewählt werden.

Wenn Sie wissen, dass der Wert in dem von Ihnen modellierten System eindeutig ist, sollten Sie Ihrer Tabelle einen eindeutigen Index oder eine eindeutige Einschränkung hinzufügen. Im Allgemeinen sollte Ihr Primärschlüssel jedoch ein "sinnloser" Wert sein, z. B. eine automatisch inkrementierte Nummer oder eine GUID.

Der Grund dafür ist einfach: Dateneingabefehler und seltene Änderungen an Dingen, die nicht veränderbar erscheinen, treten auf. Es ist viel schwieriger, Werte festzulegen, die als Primärschlüssel verwendet werden.

91
dasblinkenlight

Eine Decke "nein du solltest nicht" ist ein schrecklicher Rat. Dies ist in vielen Situationen abhängig von Ihrem Anwendungsfall, Ihrer Arbeitsbelastung, Ihrer Datenentropie, Ihrer Hardware usw. völlig zumutbar. Sie sollten keine Annahmen treffen .

Es sollte beachtet werden, dass Sie ein Präfix angeben können, das die Indizierung von MySQL einschränkt und Ihnen dabei hilft, die Ergebnisse einzugrenzen, bevor Sie den Rest durchsuchen. Dies kann jedoch mit der Zeit weniger nützlich sein, da sich Ihr Präfix "füllt" und weniger eindeutig wird.

Es ist sehr einfach, z. B .:

CREATE TABLE IF NOT EXISTS `foo` (
  `id` varchar(128),
  PRIMARY KEY (`id`(4)),
)

Beachten Sie auch, dass das Präfix (4) erscheint nach den Spaltenzitaten.

Zuletzt sollten Sie lesen, wie Indexpräfixe funktionieren und welche Einschränkungen sie haben, bevor Sie sie verwenden:

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

18
Josh

Das hängt vom jeweiligen Anwendungsfall ab.

Wenn Ihre Tabelle statisch ist und nur eine kurze Liste von Werten enthält (und es nur eine geringe Chance gibt, dass sich dies während einer Lebensdauer der DB ändert), würde ich diese Konstruktion empfehlen:

CREATE TABLE Foo 
(
    FooCode VARCHAR(16), -- short code or shortcut, but with some meaning.
    Name NVARCHAR(128), -- full name of entity, can be used as fallback in case when your localization for some language doesn't exist
    LocalizationCode AS ('Foo.' + FooCode) -- This could be a code for your localization table... 
)

Wenn Ihre Tabelle überhaupt nicht statisch ist, ist die Verwendung vonINTals Primärschlüssel natürlich die beste Lösung.

2
Tomino

ich würde in diesem Zusammenhang vorzugsweise Unique anstelle von Primärschlüssel verwenden, um Fehler bei der Dateneingabe zu vermeiden oder den Coupon-Code usw. zu aktualisieren.

0
Imran Younas

Es ist auf jeden Fall in Ordnung. Mit nur wenigen hundert Einträgen wird es schnell gehen.

Sie können eine eindeutige ID als Primärschlüssel hinzufügen (int autoincrement) und Ihren Coupon_code als eindeutig festlegen. Wenn Sie also in anderen Tabellen anfordern möchten, ist es besser, int als varchar zu verwenden

0
guikk