2012-06-06 16 views
56

może ktoś wyjaśnić o celu PRIMARY KEY, UNIQUE KEY i KEY gdyby umieścić go razem w jednym CREATE TABLE oświadczenie w MySQL?MySQL - Pojęcie „primary key”, „unikalny klucz” i „klucz”, gdy stosowane razem podczas tworzenia tabeli

CREATE TABLE IF NOT EXISTS `tmp` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `uid` varchar(255) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `tag` int(1) NOT NULL DEFAULT '0', 
    `description` varchar(255), 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `uid` (`uid`), 
    KEY `name` (`name`), 
    KEY `tag` (`tag`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 ; 

Jak przekonwertować to zapytanie na MySQL?

+3

related: [? KEY kluczowe MySQL] (http://stackoverflow.com/q/924265/697449) Zasadniczo 'KEY' jest synonimem' INDEX'. –

Odpowiedz

80

Kluczowym jest po prostu normalnym indeksu. Sposobem na uproszczenie jest myślenie o niej jak o katalogu kart w bibliotece. Wskazuje MySQL we właściwym kierunku.

Unikalny klucz służy również do poprawy szybkości wyszukiwania, ale ma ograniczenie, że nie może być żadnych duplikatów (nie ma dwóch xiy, gdzie x nie jest y i x == y).

manual wyjaśnia to następująco:

unikatowy indeks tworzy ograniczenie takie, że wszystkie wartości w indeksie musi być wyraźne. Wystąpił błąd podczas próby dodania nowego wiersza o wartości klucza dopasowanej do istniejącego wiersza. Ograniczenie to nie ma zastosowania do wartości NULL z wyjątkiem silnika pamięci BDB. W przypadku innych silników indeks UNIQUE dopuszcza wiele wartości NULL dla kolumn, które mogą zawierać wartość NULL równą . Jeśli określisz wartość prefiksu dla kolumny w indeksie UNIQUE, , wartości kolumn muszą być niepowtarzalne w obrębie prefiksu.

Klucz podstawowy jest "specjalnym" kluczem niepowtarzalnym. Jest to w zasadzie unikalny klucz, z wyjątkiem tego, że służy do identyfikacji czegoś.

Instrukcja wyjaśnia, w jaki sposób ogólnie stosowane są indeksy: here.

W MSSQL pojęcia są podobne. Istnieją indeksy, unikalne ograniczenia i klucze podstawowe.

Nietestowane, ale uważam, że jest równoważny MSSQL:

CREATE TABLE tmp (
    id int NOT NULL PRIMARY KEY IDENTITY, 
    uid varchar(255) NOT NULL CONSTRAINT uid_unique UNIQUE, 
    name varchar(255) NOT NULL, 
    tag int NOT NULL DEFAULT 0, 
    description varchar(255), 
); 

CREATE INDEX idx_name ON tmp (name); 
CREATE INDEX idx_tag ON tmp (tag); 

Edycja: Powyższy kod jest testowany za prawidłowe; jednak podejrzewam, że jest o wiele lepsza składnia do robienia tego. Minęło trochę czasu, odkąd użyłem serwera SQL i najwyraźniej trochę zapomniałem :).

+1

Świetne wyjaśnienie! Kod działa również. Dziękuję Ci bardzo! – sura2k

+0

Bez problemu. Cieszę się, że mogłem pomóc :). – Corbin

+0

Dziękuję za wskazanie mi właściwego miejsca w instrukcji! – ptpaterson

3

Klucze unikalne MySQL i klucze podstawowe służą do identyfikowania wierszy. W tabeli może znajdować się tylko jeden klucz podstawowy, ale jeden lub więcej unikalnych kluczy. Klucz to tylko indeks.

Więcej szczegółów można sprawdzić http://www.geeksww.com/tutorials/database_management_systems/mysql/tips_and_tricks/mysql_primary_key_vs_unique_key_constraints.php

do konwersji mysql do MSSQL spróbować i zobaczyć http://gathadams.com/2008/02/07/convert-mysql-to-ms-sql-server/

+0

@ Paul Bellora, twoje wyjaśnienie jest bardziej jasne niż moje. Wspaniały. – Wazan

+0

Cóż, właśnie zacytowałem dokumenty i nie widziałem drugiej części o nawróceniu. Myślę, że odpowiedź Corbina dobrze to podsumowuje. –

23

Wystarczy dodać do innych odpowiedzi, documentation daje następujące wyjaśnienie:

  • KEY jest zwykle synonimem INDEX. Kluczowy atrybut PRIMARY KEY może być również określony jako KEY, gdy jest podany w definicji kolumny.Ta wersja została zaimplementowana w celu zapewnienia zgodności z innymi systemami baz danych.

  • Indeks tworzy takie ograniczenie, że wszystkie wartości w indeksie muszą być różne. Wystąpił błąd podczas próby dodania nowego wiersza o wartości klucza dopasowanej do istniejącego wiersza. W przypadku wszystkich silników indeks pozwala na wiele wartości dla kolumn, które mogą zawierać NULL.

  • A PRIMARY KEY to unikalny indeks, w którym należy zdefiniować wszystkie kluczowe kolumny: jako NOT NULL. Jeśli nie są jawnie zadeklarowane jako NOT NULL, MySQL deklaruje je tak niejawnie (i cicho). Tabela może mieć tylko jedną wartość: PRIMARY KEY. Nazwa PRIMARY KEY jest zawsze PRIMARY, więc nie można jej używać jako nazwy dla jakiegokolwiek innego rodzaju indeksu.

+0

Dziękuję wszystkim! – sura2k

+0

Kompatybilność z innymi systemami baz danych? Jakie inne DBMS używa słowa "KEY" dla czegoś, co nie jest wcale kluczem (indeks)? Zawsze zakładałem, że to tylko trochę dziwności MySQL - i że autorzy MySQL w rzeczywistości nie wiedzą, co to jest klucz :) – sqlvogel

Powiązane problemy