2010-12-17 23 views
5

Mam kolumnę i chciałbym edytować niektóre z jej wierszy. Problem polega na tym, że tabela jest widokiem, więc nie mogę edytować wierszy. Jak mam przystąpić do rozwiązania tego problemu?Edycja widoku tylko do odczytu

Odpowiedz

2

Jeśli jest to widok, to nie jest stół. Dane dla widoku są rysowane z jednej lub więcej innych tabel. Edytuj tabelę podstawową, a gdy zbadasz dane w widoku, odzwierciedli on wprowadzone zmiany.

0

Widok SQL jest tabelą wirtualną opartą na zapytaniu SQL SELECT. Zasadniczo widok jest bardzo zbliżony do prawdziwej tabeli bazy danych (ma kolumny i wiersze, tak jak zwykły stół), z wyjątkiem faktu, że rzeczywiste tabele przechowują dane, podczas gdy widoki nie. Dane widoku są generowane dynamicznie, gdy odwołuje się widok. Widok odwołuje się do jednej lub więcej istniejących tabel bazy danych lub innych widoków. W efekcie każdy widok jest filtrem danych tabeli, do którego się odwołuje, a filtr ten może ograniczać zarówno kolumny, jak i wiersze tabel przywoływanych.

Jeśli chcesz zmodyfikować dane w tabeli, nie możesz tego zrobić w widoku. Widoki SQL są zawsze tylko do odczytu. Jeśli chcesz zmodyfikować tabelę poza widokiem, użyj czegoś takiego jak instrukcja UPDATE lub ALTER TABLE.

+3

Widoki z pewnością nie są * zawsze * tylko do odczytu w większości baz danych (choć to prawda w SQLite) . Większość baz danych obsługuje edycję pojedynczych tabel bez agregacji. Niektóre bazy danych obsługują również edycję widoków wielu tabel. –

+0

Dzięki za wskazanie tego. Możesz zaktualizować dane w widoku, pod warunkiem, że masz odpowiednie uprawnienia do podstawowych tabel. Jednak widoki w SQLite są zawsze tylko do odczytu. –

3

SQLite nie pozwala aktualizować widoków. Ale ma zezwalać na widok. Możesz więc napisać wyzwalacz INSTEAD OF UPDATE, który dokonuje odpowiednich modyfikacji w tabeli podstawowej.

3

Jak zauważyła dan04, można użyć wyzwalaczy do aktualizacji widoków (jak w większości innych baz danych). SQLite, zobacz http://www.sqlite.org/lang_createtrigger.html#instead_of_trigger

Przykład z myślą o nazwie „myview”, zawierający tabelę „my_t2”

CREATE TRIGGER myview_update INSTEAD OF UPDATE ON myview 
BEGIN 
    UPDATE my_t2 SET field1 = new.field1, field2 = new.field2 WHERE my_t2.key = old.key; 
END