2016-04-12 10 views
1

Ich habe vorher eine Tabelle mit den folgenden SQL-Code verwendet:SQL: Erstellen Tabelle mit zwei Indizes

CREATE TABLE myTable (
    id_A BIGINT NOT NULL, 
    id_B INT NOT NULL, 
    some_info varchar(255), 
    some_info2 varchar(255), 
    PRIMARY KEY (id_A) 
) 

In der vorherigen Tabelle erstellt, die beide ID_A und id_B würden eindeutige Werte sein. Ich verstehe, dass ID_A gezwungen ist, durch die PRIMARY KEY (ID_A) Code eindeutig zu sein, die perfekt ist (die auch es indiziert), aber ID_B ist nicht

Hier ist, wo ich verwirrt bin. ID_B wird auch eindeutig sein, aber ich bin mir nicht sicher, wie erzwungen wird, dass er in der Tabelle eindeutig ist und wie die Datenbank einen Index für sie erstellt, damit zukünftige Abfragen, die SELECT für diese Tabelle verwenden, eine gute Leistung haben. Ich weiß, dass ich nicht zwei Primärschlüssel haben:

PRIMARY KEY (id_A) 
PRIMARY KEY (id_B) 

Wie könnte ich auch einen Index für id_B machen gehen über, so dass zukünftige Anfragen effizient geschehen?

+0

Ich glaube, MySQL hat das UNIQUE-Schlüsselwort, das Sie nach dem Datentyp setzen können. – SCFi

+0

Werfen Sie einen Blick auf diese: http://stackoverflow.com/questions/5038040/mysql-make-an-existing-field-unique –

+0

Ich schlage vor, Sie lesen auf Primärschlüssel. Primärschlüssel sind eher ein Zeilen- "Bezeichner" als ein Index. –

Antwort

4

Sie können einen UNIQUE INDEX auf der Spalte hinzufügen. Während eine Tabelle nur eine PRIMARY KEY haben kann, kann sie so viele UNIQUE INDEX wie Sie benötigen.

ALTER TABLE myTable 
ADD UNIQUE INDEX `UI_myTable_idB` (`id_B`); 
+0

Große Antwort! Ist die 'UI_myTable_idB' fehlt eine Unterstreichung? zu werden: 'UI_myTable_id_B' – Webeng

+0

Es ist nur ein Name, also ist es egal, ob es die Unterstreichung hat oder nicht. Das war nur die Benennungskonvention, die ich verwendet habe ('UI' + Tabellenname ohne Unterstriche + Spaltenname ohne Unterstriche. Sie könnten es so benennen, wie Sie wollen. –

+1

oh ich sehe, es ist der Name des neuen Index erstellt, und was ist in der Klammern verbinden den Code mit der Spalte, die Sie indizieren möchten. Danke mate! – Webeng

2

Sie können den MySQL UNIQUE KEY für die Spalte verwenden. Dadurch werden die Werte in der Spalte id_B eindeutig, aber nicht als Primärschlüsselspalte verwendet. Sie können es mit dieser Aussage erreichen:

CREATE TABLE myTable (
id_A BIGINT NOT NULL, 
id_B INT NOT NULL, 
some_info varchar(255), 
some_info2 varchar(255), 
PRIMARY KEY (id_A), 
UNIQUE KEY (id_b)) 

Dies wird automatisch Index der Spalte, wie Sie es wollen. Primärschlüssel und eindeutige Schlüssel in einer MySQL-Tabelle sind im Wesentlichen die gleichen, außer dass ein Primärschlüssel nicht NULL sein kann und es nur eine Primärschlüsselspalte (oder eine Kombination von Primärschlüsselspalten) geben kann. Es kann eine beliebige Anzahl eindeutiger Schlüsselspalten geben.

+0

Wäre' EINZIGARTIGER SCHLÜSSEL (id_b) 'nicht nur die Spalte einzigartig, sondern auch indexieren oder muss ich eine Zeile wie' UNIQUE INDEX (id_b) 'verwenden? – Webeng

+0

In MySQL Schlüssel und Index im Wesentlichen das Gleiche bedeuten. Also nein, Sie würden nicht brauchen um 'UNIQUE INDEX (id_B)' zu spezifizieren 'Mit 'UNIQUE KEY (id_B)' MySQL macht die Indexierung für Sie – Matt

+0

Danke Matt, ich habe Ihren Beitrag updated.Wenn ich zwei Antworten akzeptieren könnte, hätte ich auch grün überprüft deine :) – Webeng