2011-11-23 11 views
9

ta nie wykonuje:Dlaczego nie możesz użyć SQLite ROWID jako klucza głównego?

create table TestTable (name text, age integer, primary key (ROWID)) 

Komunikat o błędzie jest:

11-23 11: 05: 05,298: ERROR/Database (31335): Failure 1 (tabela TestTable ma kolumnę o nazwie ROWID) na 0x2ab378 podczas przygotowywania "create table TestTable (nazwa, wiek, klucz podstawowy (ROWID))".

Jednak po TestTable jest tworzony, to przygotowuje i wykonuje dobrze:

create table TestTable (name text, age integer); 

insert into TestTable (name, age) values ('Styler', 27); 

select * from TestTable where ROWID=1; 

mógłbym potencjalnie zobaczyć ROWID jako rozwiązanie wymagające klucza podstawowego auto-inkrementacja i klucz obcy, które są nigdy nie zostaną użyte jako wypełnione danymi na warstwie aplikacji. Ponieważ ROWID jest domyślnie ukryty przed setami wyników select, byłoby miło powiązać to z kluczem podstawowym, zachowując to ukryte przed logiką aplikacji. OracleBlog: ROWNUM and ROWID twierdzą, że jest to niemożliwe i niewskazane, ale nie dostarcza wielu innych wyjaśnień.

A zatem, skoro odpowiedź "jest taka możliwa" zdecydowanie nie jest/niewskazana, pytanie brzmi mniej więcej "dlaczego nie"?

+1

ROWNUM zmienia się po każdej aktualizacji rekordu, ROWID zmienia się w zależności od sortowania lub kolejności zestawu wyników. A więc RowNum jest złe, ponieważ chciałbyś zaktualizować wszystkie klucze obce za każdym razem, gdy wprowadzana jest zmiana do wzorca. (mnóstwo narzutów) i ROWID jest zły, ponieważ identyfikator nie istnieje, dopóki zestaw wyników nie zostanie utworzony i uporządkowany. Jeśli nie istnieje, nie możesz do niego dołączyć. – xQbert

+0

@xQbert jeśli ROWID jest odwoływany przez klucz podstawowy, w jaki sposób zmieniałby się w zależności od kolejności kolumn w zestawie wyników? – styler1972

+0

ROWID nie istnieje w tabeli opisującej testtable. zobaczysz, że ROWID nie ma. ROWID jest kolumną systemową i wartością systemową. nie możesz mieć PK w kolumnie systemu; nie masz uprawnień, aby to zrobić. O powyższym: mam to w tył; ROWID może się zmieniać w zależności od aktualizacji w stosunku do ROWNUM, która zmienia się w zależności od wyboru whereclause. – xQbert

Odpowiedz

28

Z SQLite.org:

Jeżeli tabela zawiera kolumnę typu INTEGER klucz podstawowy, to kolumny staje się alias ROWID. Następnie można uzyskać dostęp do urządzenia ROWID przy użyciu dowolnej z czterech różnych nazw, trzech oryginalnych nazw opisanych powyżej lub nazwy nadanej kolumnie INTEL GENERALNY KLUCZ. Wszystkie te nazwy są aliasami dla siebie i działają równie dobrze w każdym kontekście .

Po prostu użyj go jako klucza podstawowego.

+1

Dodając dowolny automatyczny inkrementujący klucz podstawowy, zasadniczo używam ROWID jako klucza podstawowego. Myślałem, ponieważ to było tak łatwe, że mogłem po prostu zadeklarować, że Rowid jest pierwotny. Oczywiście jest trochę więcej. To właśnie dostaję za inne myślenie, wstyd mi: D – styler1972

+2

[Dodanie klawisza auto-inkrementacji nieznacznie zmienia zachowanie] (http://www.sqlite.org/autoinc.html). ROWID nie zawsze jest odpowiedni, przede wszystkim jeśli wymagane są monotonicznie rosnące wartości. – user2864740

Powiązane problemy