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"?
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
@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
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