Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: czym się różni PRIMARY KEY( c1, c2 ) od UNIQUE ( c1, c2 )
Forum PHP.pl > Forum > Bazy danych > SQLite
jolam
Witam serdecznie

Chciałabym aby w mojej tabeli pary wartości z 2 kolumn się nie powtarzały. Czyli aby nie było np takiej pary: 2,2,3 jeśli już istnieje 2,3,3.
Znalazłam dwa rozwiązania:
CREATE TABLE t(
c1 INTEGER,
c2 INTEGER,
c3 INTEGER,
UNIQUE( c1, c2 )
)
CREATE TABLE t(
c1 INTEGER,
c2 INTEGER,
c3 INTEGER,
PRIMARY KEY( c1, c2 )
)

Czym one się różnią? Które lepsze? Bardzo proszę o pomoc

pozdrawiam Jola
jmail
Primary key utworzy CI klucz główny co ma duże znaczenie przy korzystaniu z kluczy obcych. Poza tymw oparciu o ten klucz będzie stworzony główny index dla tabeli.

w Twoim wypadku nie ma to znaczenia większego chyba, że zamierzasz przechowywać miliony informacji - wtedy index zdecydowanie się nada. tablica zindexowana działa szybciej
jolam
Czyli PRIMARY KEY przyśpiesza wyszukiwanie w takiej tabeli? A jeśli ja będę szukać w tej tabeli tylko po pierwszej kolumnie to takie
CREATE TABLE t(
c1 INTEGER PRIMARY KEY,
c2 INTEGER,
c3 INTEGER,
UNIQUE( c1, c2 )
)
rozwiązanie będzie lepsze?
Szukałam na stronach sqlite i tam coś było o jakimś błędzie, który dopiero ma zostać poprawiony właśnie z PRIMARY KEY ale nie zrozumiałam. Wiesz o co chodzi?
jolam
A jeszcze chciałam się zapytać, czy dobrze jest od razu przy definicji tabeli dodawać ograniczenie UNIQUE(kolumny) jeśli prawdopodobnie dane powinny być w nich unikalne?. No teraz jeszcze nie jestem tego pewna, ale tak mi się wydaje, to od razu warto dodać to UNIQUE?

pozdrawiam Jola
erix
Zależy. Z praktycznego punktu widzenia - można korzystać z konstrukcji insert into ... on duplicate key update, a jeśli chodzi o teorię - DBMS nie dopuści do wstawienia więcej niż jednego rekordu z takim indeksem.

Wówczas baza zwróci błąd, a jest to najczęściej sytuacja niepożądana.
jolam
Ale zawsze wtedy będę mogła wygenerować choćby tymczasowy wpis który będzie unikalny. No już sama nie wiem. Wstawianie UNIQUE gdzie tylko się da pozwoli ustrzec się błędów później, zdublowanych wpisów? Jak mi radzicie?


pozdrawiam Jola
jmail
erix - nie znasz się to nie odzywaj i nie wprowadzaj w błąd - jasno i wyraźnie jola napisała, że chodzi o sqlite więc czemu wyjeżdżasz jej z propozycją składni MySQL'a? zadziała jej to? nie sądzę.

jola - standardowy insert wystarczy, zastanów się tylko co chcesz zrobić jeżeli się "popsuje"

  1.  
  2. INSERT bla bla bla ON CONFLICT REPLACE
  3.  


tu masz opisane

http://www.sqlite.org/lang_conflict.html
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.