04 Tworzenie, zmienianie i usuwanie rekordów


#85
Rozdział 4.
Tworzenie, zmienianie i usuwanie rekordów

Po utworzeniu w bazie danych tabel, kolejny krok polega na wypełnieniu ich danymi. Najpierw należy zgromadzić dane, które mają zostać wprowadzane do bazy, a następnie sprawdzić ich poprawność. Ostatni etap polega na wprowadzeniu danych wykorzystując instrukcję INSEKT.
Poza instrukcją INSEKT do wprowadzania zmian w zawartości tabeli służą jeszcze dwie inne instrukcje SQL: UPDATE i DELETE. W tym rozdziale zostaną omówione wszystkie te trzy instrukcje. Będzie też mowa o trzech innych poleceniach, stosowanych do utrzymania bazy danych: TRUNCATE, DROP i ALTER.

Przygotowanie danych

Przed wprowadzeniem danych do bazy bardzo istotne jest sprawdzenie, czy dane są zgodne z konwencjami i założeniami przyjętymi dla danych tego typu. Na przykład wprowadzając dane do kolumny, która przechowuje pewien stan: aktywny lub nieaktywny, należy z góry określić, jakie dwie wartości będą stosowane do reprezentowania bieżącego stanu tego pola. Można stosować wartości prawda i fałsz, tak i nie albo nawet 1 i 0. Najważniejsze, aby dane w całej kolumnie były wpisywane zgodnie z raz przyjętą konwencją. Dużym ułatwieniem w tym wypadku jest użycie typu danych BIT, który przyjmuje tylko dwie wartości, a więc wszystkie dane w kolumnie na pewno będą zgodne zjedna konwencją. Nie przestrzeganie tych zasad może znacznie utrudnić pobieranie danych oraz analizę wyników zapytań.
Weźmy pod uwagę numer telefonu jako typ wartości wprowadzanych do bazy. W wielu przypadkach zostaje on podzielony kropkami, jak na przykład: 919.555.1212, innym razem używa się notacji amerykańskiej (919) 555-1212. Najlepszym rozwiązaniem jest wprowadzanie numeru bez dodatkowych elementów formatujących.
#86
Najważniejsze jest, by stosować zawsze tylko jedną konwencję bez względu na to, którą wybraliśmy. W przypadku nie stosowania się do tej zasady numer telefonu wpisany kilkakrotnie, za każdym razem w innym formacie w bazie danych będzie uważany za inny.
Z przedstawionych przykładów wynika wniosek, że przydatność zgromadzonych w bazie danych informacji w dużym stopniu zależy od poprawnego i zgodnego z przyjętymi, jednolitymi konwencjami sformatowania, które musi nastąpić przed zapisaniem danych do bazy. Inne elementy wpływające na jakość sformatowania danych to: używanie wielkich liter zgodnie z przyjętymi zasadami, unikanie spacji poprzedzających oraz kończących wprowadzane łańcuchy i nie wnoszących żadnych dodatkowych informacji. Po dokonaniu analizy poprawności przygotowanych danych można przystąpić do ich wprowadzania do tabel.

Instrukcja INSERT

INSERT jest jedyną instrukcją języka SQL służącą do dopisywania nowych rekordów do tabel. Wyrażenie typu SELECT ... INTO może być wykorzystane do utworzenia tabeli i jednoczesnego wypełnienia jej wierszami. Instrukcja INSERT powoduje dodanie rekordów do tabeli jeden po drugim. Wykorzystując podzapytania (omówiono je dokładnie w rozdziale 9.) można także za jej pomocą kopiować dane między tabelami.
Podstawowa struktura instrukcji INSERT wygląda następująco:

INSERT INTO nazwa_tabeli
[(lista_kolumn)]
VALUES (lista_wartości)

Nazwa_tabeli określa tabelę, do której chcemy wprowadzić nowy rekord (lub rekordy). W przypadku, gdy chcemy wprowadzić wartości tylko dla niektórych kolumn, pozwalając resztę uzupełnić wartościami dla nich domyślnymi, należy podać nazwy kolumn, do których chcemy wprowadzić wartości.
Pominięcie listy kolumn w instrukcji INSERT wymusza podanie wartości dla wszystkich kolumn w tabeli.
Przyjrzyjmy się przykładowej instrukcji, która tworzy nowy rekord w tabeli stu-dios. Jeżeli nie podamy listy kolumn, to musimy podać wartości dla każdej kolumny w kolejności, jaka była ustalona podczas definicji tabeli.
===================
Rada
W większości baz danych kolumny w tabeli pojawiają się w porządku, w jakim zostały utworzone. Definiując nową tabelę przy pomocy instrukcji CREATE TABLE kolumny zachowują kolejność, w jakiej zostały wypisane. Nowe kolumny dopisane do tabeli przy pomocy instrukcji ALTER TABLE pojawiają się na końcu tej listy.
===================
#87
-------------------------
Listing 4.1. Dopisanie rekordu do tabeli Studios, przy pomocy instrukcji INSEKT

INSEKT INTO Studios
VALUES (1, 'Giant', 'Los Angeles', 'CA')

1 rów created
-----------------------

Tabela Studios składa się z następujących kolumn: studio_id, studio_name, studio_city, studio_state. Instrukcja INSERT zadziała prawidłowo, ponieważ kolejność podana w sekcji VALUES odpowiada kolejności kolumn w tabeli. W przypadku, gdy nie jesteśmy pewni w jakiej kolejności występują kolumny w tabeli, możemy wypisać listę kolumn jak na listingu 4.2.
-----------------------
Listing 4.2. Instrukcja INSERT z podaną listą kolumn

INSERT INTO Studios
(studio_city, studio_state, studio_name,
studio_id y>VALUES ('Burbank', 'CA', 'MPM', 2)

1 rów created
-----------------------

Jak wynika z powyższego przykładu, w przypadku podania listy kolumn, dla których wartości pojawiają się w klauzuli VALUES, nie ma znaczenia kolejność kolumn.
=================
Rada
W praktyce lepiej jest zawsze podawać listę kolumn w instrukcji INSERT, ponieważ kod jest wtedy bardziej przejrzysty i łatwiejszy do analizy. Szczególnie w przypadku tabel składających się z wielu kolumn, zapamiętanie ich nazw i kolejności może sprawić spore problemy, jeżeli pominiemy listę kolumn.
==================

Wprowadzanie wartości domyślnych i wartości nuli

Dysponujemy dworna metodami do wprowadzenia wartości null do pola w tabeli. W pierwszym przypadku, jeżeli pole ma zadeklarowaną wartość domyślną jako null, możemy użyć instrukcji INSERT pomijając wybraną kolumnę na liście kolumn.
-----------------------
Listing 4.3. Wprowadzenie nowego rekordu z wartościami null

INSERT INTO People
(person_id, person_fname, person_lname,)
VALUES (l, 'Leon', 'Bruk', '543890123')

1 rów created
-----------------------

Leon Bruk został wpisany do bazy danych, ale większość pól tabeli została pusta.
-----------------------
Listing 4.4. Instrukcja SELECT wyszukująca dopisany rekord

SELECT *
FROM People
WHERE person_id=l
#88
PERSON_ID PERSON_FNAME PERSON_LNAME
------------------------- -------------
PERSON_ADDRESS
--------------------------------------------
PERSON_CITY PERSON_UNION
------------ --------------------------
1 Leon Bruk
543890123
--------------------

Wyobraźmy sobie sytuację, gdy chcemy dopisać nową osobę do tabeli People, znając tylko jej imię, nazwisko i numer ubezpieczenia. Gdy pominiemy pozostałe kolumny w instrukcji INSEKT, dopisanie rekordu odbędzie się zgodnie z naszym oczekiwaniem: w pozostałych polach rekordu będą wartości NULL.
Jak widać, rekord składa się w większości z pustych pól, ponieważ w instrukcji IN-SERT nie zostały podane dla nich żadne wartości. Zwróćmy jednak uwagę, że w polu person_union pojawia się wartość y, a to dlatego, że jest dla tego pola wartością domyślną. Aby wprowadzić wartość null do tego pola, należy podać wprost nazwę kolumny oraz wartość NULL, tak jak pokazuje listing 4.5.
--------------------
Listing 4.5. Wprowadzanie wartości null w instrukcji INSEKT

INSERT INTO People
(person_id, person_fname, person_lname, person_ssn, person_union)
VALUES (1, 'Leon', 'Bruk', '543890123', NULL)

1 rów created
--------------------

Instrukcja INSERT z listingu 4.5 umieszcza wartość null w polu person_union zamiast domyślnej wartości y. Taka operacja jest możliwa bez względu na zadeklarowany w polu typ danych, pod warunkiem, że dopuszczalne jest wprowadzanie wartości null dla danej kolumny. Jak pokazano w sposób pośredni na listingu 4.3, wprowadzenie wartości domyślnych dla wybranych kolumn polega na pominięciu ich w instrukcji INSERT zarówno w sekcji listy kolumn, jak na liście wartości.

Równoczesne użycie instrukcji SELECT i INSERT

W tym miejscu zajmiemy się wykorzystaniem podzapytań. Podzapytania polegają na umieszczeniu jednego zapytania wewnątrz innego. Chciałbym pokazać, jak wykorzystać instrukcję SELECT wewnątrz instrukcji INSERT, aby dostarczyć danych do dopisania do tabeli. Szczegóły dotyczące podzapytań są wyjaśnione w rozdziale 9., z kolei opisem składni instrukcji SELECT zajmują rozdziały od 5. do 9.
Jak pokazałem wcześniej, instrukcja INSERT składa się z trzech części, z których jedna jest opcjonalna. Pierwsza część instrukcji wskazuje na tabelę, do której będą dopisywane nowe rekordy. Druga część to lista kolumn, do których będą dopisywane wartości. W przypadku, gdy wartości będą wpisywane do wszystkich kolumn, lista ta może być pominięta. Ostatnia część dotyczy podania listy wartości, jakie mają być w nowym rekordzie wpisane.
#89
===============
Rada
Wykorzystanie instrukcji SELECT zagnieżdżonej w instrukcji INSEKT jest szczególnie użyteczne, gdy pracujemy z bazą danych, która nie umożliwia modyfikacji struktury tabel po ich utworzeniu. Chcąc zmodyfikować tabelę w takim systemie musimy wykonać kilka operacji. Po pierwsze, należy utworzyć kopię tabeli, która ma być modyfikowana. Następnie usunąć tabelę źródłową, a w jej miejsce utworzyć nową tabelę, odzwierciedlającą pożądane zmiany. Wykorzystanie podzapytania w instrukcji INSEKT znacznie uprości operację kopiowania danych między tabelami.
===============

Zamiast podawania listy wartości w klauzuli VALUES można tam umieścić instrukcję SELECT, która takich wartości dostarczy. Załóżmy, że założyłem tabelę, która będzie gromadzić listę miast i stanów jak pokazuje listing 4.6.
--------------------
Listing 4.6. Definicja tabeli Cityjtiate

CREATE TABLE City_State
(city VARCHAR2(20),
state CHAR(2) ),

Table created
--------------------

Możemy tę tabelę wypełnić danymi zgromadzonymi w tabeli studios wykorzystując instrukcję INSEKT (listing 4.7).
--------------------
Listing 4.7. Podzapytanie -wpisujące dane do tabeli City_State

INSEKT INTO City_State
SELECT studio_city, studio_state FROM Studios

5 rows created
--------------------

Zobaczmy wynik tego zapytania na listing 4.8.
--------------------
Listing 4.8. Wynik zapytania z listingu 4.7

SELECT studio_city, studio_state
FROM Studios

STUDIO_CITY ST
----------- -----
Los Angeles CA
Burbank CA
Apex NC
Austin TX
Los Angeles LA
---------------------

Każdy z wierszy zwróconych przez zapytanie na listingu 4.8 służy do dopisania nowego rekordu do tabeli City_State. Jak widać, posługując się podzapytaniem można utworzyć w jednym czasie wiele rekordów. Zwróć uwagę, jak wygląda tabela City_State po wykonaniu zapytania z listingu 4.7.
#90
---------------------
Listing 4.9. Zawartość tabeli CityJState

SELECT *
FROM City_State

STUDIO_CITY ST
------------- ---
Los Angeles CA
Burbank CA
Apex NC
Austin TX
Los Angeles LA
------------------

Jak widać, rezultaty zapytań z listingu 4.8 oraz 4.9 są identyczne. Kolejne szczegóły dotyczące podzapytań zostaną opisane w rozdziale 9.

Kopiowanie tabel, usuwanie powtarzających się wierszy

Szczególnie użytecznym zastosowaniem instrukcji INSERT wraz z podzapytaniem jest kopiowanie zawartości jednej tabeli do drugiej. Niektóre bazy danych nie pozwalają na wprowadzanie zmian w definicji tabeli po jej utworzeniu. Wtedy, jeśli chcesz zmienić rozmiar kolumny, zmienić typ danych kolumny lub wprowadzić jakiekolwiek zmiany do struktury tabeli, musisz utworzyć nową tabelę i przenieść dane ze starej tabeli do nowej. Instrukcja INSERT z podzapytaniem pozwala na wykonanie tego zadania w bardzo prosty sposób.
Jak pokazuje listing 4.10, najpierw utworzyłem kopię tabeli studios bez zdefiniowanych ograniczeń na kolumnach.
---------------------
Listing 4.10. Instrukcja tworząca kopię tabeli Studios

CREATE TABLE Studios_Copy
(studio_id NUMBER,
studio_name VARCHAR2(20),
studio_city VARCHAR2(20),
studio_state CHAR(2))

Table created.
------------------

Po utworzeniu kopii tabeli, mogę użyć podzapytania z instrukcją INSERT, aby przekopiować dane z tabeli źródłowej do kopii. Pokazuje to listing 4.11
------------------
Listing 4.11. Kopiowanie danych z tabeli Studios do StudiosjCopy

INSERT INTO Studios_Copy
SELECT * FROM Studios

5 rows created.
------------------
------------------
Listing 4.12. Zawartość tabeli Studios_Copy po kopiowaniu danych

SELECT *
FROM Studios_Copy
#91
STUDIO_ID STUDIO_name STUDIO_CITY ST
--------- ---------- ------------ ---
1 Giant Los Angeles CA
2 MPM Burbank CA
3 FKG Apex SG
4 ZODIAK II Austin TX
5 SYRENA II Los Angeles LA

Jak widać, zawartość tabeli studios została przekopiowana do tabeli stu-dios_,Copy. Warto zwrócić uwagę, że typy danych nowej tabeli różnią się od tych z tabeli Studios. Dopóki dane zwracane przez podzapytanie mogą być bez błędu dodawane do nowej tabeli, dane z tabeli źródłowej będą kopiowane do nowej tabeli.
Tak więc kopiowanie danych z kolumny typu VARCHAR(255) do kolumny VAR-CHAR (25) jest możliwe, dopóki dane nie są dłuższe niż 25 znaków. Operacja taka ma sens, gdy wiemy, że dane spełniają kryteria nowego typu danych. Takie kopiowanie danych jest stosowane, gdy nie można zmienić typu danych tabeli źródłowej, w której są już zgromadzone dane.
Można także wykorzystać kopiowanie danych w celu eliminacji wartości powtarzających się. Jak wiadomo, w modelu relacyjnych baz danych każdy rekord tabeli powinien być unikalny. Jednak czasem, gdy baza jest błędnie zaprojektowana pojawiają się identyczne rekordy. Na przykład wykorzystanie danych z tabeli People do wypełnienia tabeli city_State wykonane zgodnie z instrukcją z listingu 4.13 wywołuje skutek pokazany na listingu 4.14.
------------------
Listing 4.13. Kopiowanie danych z tabeli People do tabeli City_State

INSERT INTO City__State
SELECT person_city, person_state FROM People

11 rows created.
------------------
------------------
Listing 4.14. Zawartość tabeli City_State

SELECT *
FROM City_State

CITY ST
------------ ---
Los Angeles CA
Burbank CA
Apex NC
Austin TX
Los Angeles LA
Cary NC
Cary NC
Buffalo NY
Dallas TX
Huston TX
Bellaire TX
CITY ST
Knoxville TN
New Orleans LA
Madlson WI
Huston TX
Cary NC

16 rows selected
---------------------
#92
Jak widać, na listingu 4.14 pojawia się kilka wierszy identycznych. W relacyjnej bazie danych taki przypadek jest niedopuszczalny. Jak w takim razie pozbyć się zduplikowa-nych wierszy? Normalnie możnaby wykorzystać instrukcje DELETE. Jednak ponieważ wiersze są identyczne, nie ma możliwości usunięcia tylko jednego z nich.
Do rozwiązania tego zadania wykorzystamy operator DISTINCT, który wybiera tylko unikalne wiersze. Działanie operatora DISTINCT jest szczegółowo omówione w rozdziale 7.
Na listingu 4.15 pojawiają się tylko rekordy unikalne. Aby usunąć zduplikowane rekordy w tabeli City_state można skopiować otrzymane na listingu 4.15 wartości do nowej tabeli, usunąć wszystkie rekordy z tabeli City_state i z powrotem skopiować je z tabeli tymczasowej. Kolejne kroki przedstawiono na listingu 4.16.
---------------------
Listing 4.15. Instrukcja wybierająca tylko niepowtarzające się rekordy z tabeli City_State

SELECT DISTINCT *
FROM City State

CITY ST
--------- ---
Apex NC
Austin TX
Bellaire TX
Buffalo NY
Burbank CA
Cary NC
Dallas TX
Huston TX
Knoxville TN
Los Angeles CA
Los Angeles LA
CITY ST
Madison WI
New Orleans LA

13 rows selected
---------------------
---------------------
Listing 4.16. Sekwencja zapytań w wyniku których usunięto powtarzające się wiersze z tabeli City_State

CREATE TABLE City_State_Copy
(city VARCHAR2(20),
state CHAR(2))

Table created.

INSERT INTO City_State_Copy
SELECT DISTINCT * FROM City_State

13 rows created.

DELETE FROM City_State

16 rows deleted.

INSERT INTO City_State
SELECT * FROM City_State_Copy

13 rows created.

DROP TABLE City_State_Copy

Table dropped.
---------------------

#93
Zapytania z listingu 4.16 wykonują operację, w wyniku której usunięto powtarzające się wiersze z tabeli City_state. W wyniku pierwszego zapytania została utworzona tabela City_state_Copy. Następnie zostały do niej przekopiowane niepowtarzające się wiersze z tabeli city_state. Kolejne zapytanie usuwa wszystkie rekordy z tabeli City_state, następne kopiuje z powrotem dane z tabeli City_State_Copy do City_State.
Na końcu zostaje usunięta tabela City_state_Copy.

Instrukcja DELETE

Instrukcja DELETE służy do usuwania rekordów z tabeli. Struktura instrukcji jest bardzo prosta:

DELETE FROM tabela
[WHERE warunek]

Opcjonalna część z klauzulą WHERE jest wykorzystywana do ograniczenia rekordów, które zostaną usunięte. Pominięcie tej części powoduje, że wszystkie rekordy są usuwane. Używając klauzulę WHERE można określić warunki, jakie musi spełnić rekord do usunięcia. Na przykład zapytanie z listingu 4.17 usuwa rekordy, gdy w polu state jest TX.
---------------------
Listing 4.17. Instrukcja DELETE usuwająca rekordy, gdy w polu state jest TX

DELETE FROM City_State
WHERE state= 'TX'

4 rows deleted

SELECT *
FROM City_State

CITY ST
------- ---
Apex NC
Buffalo NY
Burbank CA
Cary NC
Knoxville TK
Los Angeles CA
Los Angeles LA
Madison WI
New Orleans LA

9 rows selected.
---------------------

Instrukcja UPDATE

Instrukcja UPDATE jest wykorzystywana do wprowadzania zmian w istniejących rekordach. Struktura instrukcji jest następująca:

UPDATE tabela
SET kolumna = wartość,
[WHERE warunek]
#94
Instrukcja składa się z trzech części. W pierwszej części określamy, jaka tabela będzie aktualizowana. Druga część - klauzula SET służy do podania listy kolumn, które będą zmieniane i nowych wartości, które zostaną przypisane tym kolumnom. W ostatniej części za pomocą klauzuli WHERE określamy wiersze tabeli, w których nastąpi zmiana.
Weźmy pod uwagę przypadek, gdy studio Giant zostaje przeniesione z Los Angeles w stanie California do Nowego Jorku w stanie Nowy Jork. Powinniśmy dokonać aktualizacji danych jak na listingu 4.18.
---------------------
Listing 4.18. Instrukcja UPDATE zmieniająca wartości w polu city i state

UPDATE Studios SET studio_city = 'Nowy Jork', studio_state = 'NY'
WHERE studio_id = 1

1 rów updated.
---------------------

Jak widać z sekcji SET zmianie ulega zarówno city i state. Klauzula WHERE wskazuje, że tylko rekordy z wartością l w polu studio_id będą aktualizowane. W przypadku pisania instrukcji, która ma modyfikować tylko jeden rekord, dobrze jest użyć w klauzuli WHERE warunku na kluczu głównym.
Instrukcję UPDATE z listingu 4.18 może również przedstawić w formacie jak na listingu 4.19.
---------------------
Listing 4.19. Instrukcja UPDATE w innym zapisie

UPDATE Studios
SET (studio_city, studio_state) = ('Nowy Jork' = 'NY')
WHERE studio_id = 1

1 rów updated
('Nowy Jork' = 'NY')

Opuszczenie klauzuli WHERE powoduje, że aktualizacja dotyczy wszystkich rekordów w tabeli.
-------------------------
Listing 4.20. Instrukcja UPDATE zmieniająca wszystkie rekordy

UPDATE Studios
SET studio state = 'AK'

5 rows updated.

SELECT *
FROM Studios

STUDIO_ID STUDIO_NAME STUDIO_CITY ST
--------- ------------ ----------- ---
1 Giant Los Angeles AK
2 MPM Burbank AK
3 FKG Apex AK
4 ZODIAK II Austin AK
5 SYRENA II Los Angeles AK
-------------------------

W polu studio_state wartość dla każdego rekordu została zmieniona na AK.
#95
Instrukcja TRUNCATE

Jeśli zamierzasz usunąć wszystkie rekordy z tabeli, możesz użyć instrukcji TRUNCATE (można użyć skrótu TRUNC). Dwie instrukcje pokazane na listingu 4.21 mają taki sam skutek.
-------------------------
Listing 4.21. Porównanie instrukcji TRUNCATE i DELETE

DELETE FROM Studios

5 rows cteleted.

TRUNCATE TABLE Studios

Table truncated.
-------------------------

Różnica między instrukcjami polega na tym, że DELETE wykonuje operację usuwania każdego rekordu osobno, z kolei TRUNCATE usuwa wszystkie rekordy równocześnie i dlatego jest wykonywana znacznie szybciej. Efektem obu tych poleceń jest pusta tabela.
Z użyciem instrukcji TRUNCATE związane mogą być jednak pewne problemy. TRUNCATE powoduje bezwarunkowe usuwanie rekordów, bez sprawdzania ograniczeń związanych z integralnością danych. Jeżeli dla tabeli zdefiniowano kaskadowe usuwanie powiązanych rekordów z tabeli podrzędnej, instrukcja TRUNCATE zignoruje to.
Niektórzy programiści tworzą specjalne procedury składowane zwane wyzwalaczami, które są wywoływane podczas niektórych zdarzeń w bazie danych. Jednak instrukcja TRUNCATE ignoruje przyporządkowane zdarzeniu wyzwalacze. Jeśli chcesz je wykorzystywać, używaj do usuwania rekordów instrukcji DELETE.

Instrukcja DROP

Instrukcja DROP służy do usuwania obiektów z bazy danych. Przy jej pomocy możemy usunąć tabele, indeksy, użytkowników, a nawet całą bazę danych. Możliwe kombinacje instrukcji DROP i słów kluczowych decydują o wykonaniu konkretnej operacji, podobnie jak w przypadku instrukcji CREATE. Tyle samo wspólnego co instrukcje CREATE TABLE oraz CREATE INDEX mają ze sobą instrukcje DROP TABLE i DROP INDEX. Pierwsze tworzyły nowe obiekty w bazie danych, instrukcje DROP je usuwają.

DROP TABLE

DROP TABLE usuwa tabelę z bazy danych. Jednocześnie z tabelą usunięciu ulegają wszystkie zgromadzone w niej dane oraz jej indeksy.
#96
Jeśli na innych tabelach byty zdefiniowane ograniczenia, odwołujące się do usuwanej tabeli, to te ograniczenia też zostaną usunięte.
-------------------------
Listing 4.22. Instrukcja usuwająca tabelę Studios z bazy danych

DROP TABLE Studios

Table dropped
-------------------------

DROP INDEX

Usunięcie indeksowania wybranej kolumny lub grupy kolumn w tabeli polega na użyciu instrukcji DROP INDEX. Indeksy, tak jak tabele, mają swoje nazwy, więc usuwanie odbywa się poprzez podanie nazwy indeksu po słowach kluczowych DROP INDEK.
-------------------------
Listing 4.23. Instrukcja usuwająca indeks z kolumny

DROP INDEX filmy_indeks

Index dropped.
-------------------------

Instrukcja ALTER

Tak jak instrukcja CREATE dla tabeli jest analogiczna do instrukcji INSEKT dla wierszy tabeli, a instrukcja DROP analogiczna do instrukcji DELETE, tak ALTER jest instrukcją działającą analogicznie do instrukcji UPDATE. Służy do wprowadzania zmian do obiektów istniejących w bazie danych.
Instrukcje DROP i CREATE są dostępne w niemal każdej bazie danych. Instrukcja ALTER może nie być dostępna w każdym produkcie. W takich wypadkach jesteśmy zmuszenie usuwać istniejący obiekt i na jego miejsce tworzyć nowy, z uwzględnieniem potrzebnych zmian. W dalszej części książki, omawiającej konkretne implementacje baz danych, zostały wskazane produkty, w których możliwe jest stosowanie instrukcji ALTER.

ALTER TABLE

Instrukcja ALTER TABLE służy do wprowadzania zmian w strukturze tabeli. Można dodać kolumny lub zmienić dla wybranej kolumny zadeklarowany typ danych, o ile dane przechowywane w tej kolumnie będą zgodne z nowym typem. Nie można jednak usunąć kolumny przy pomocy tej instrukcji. Jeśli trzeba przeprowadzić taką operację, musimy usunąć całą tabelę i utworzyć nową, bez kolumny przeznaczonej do usunięcia.
==============
Rada
Wiele baz danych nie obsługuje instrukcji ALTER. W takich wypadkach, jeśli chcemy zmienić strukturę tabeli, musimy ją usunąć i ponownie założyć z uwzględnionymi zmianami.
===============
#97
Składnia instrukcji ALTER TABLE jest trochę bardziej złożona. Może być użyta w dwóch postaciach. W pierwszej używamy jej do dopisania nowej kolumny do tabeli, w drugiej do modyfikacji definicji tabeli.
Składnia instrukcji wykorzystywanej do dopisania nowej kolumny wygląda następująco:

ALTER TABLE tabela
ADD (kolumna typ_danych [DEFAULT wyrażenie]
[REFERENCES tabela (kolumna)]
[CHECK warunek]

Jak widać, wszystkie atrybuty jakie możemy nadać kolumnie podczas definicji tabeli są również dostępne przy tworzeniu nowej kolumny w istniejącej tabeli.
-------------------------
Listing 4.24. Instrukcja dopisująca nawą kolumnę do tabeli

ALTER TABLE Studios
ADD (revenue NUMBER DEFAULT 0)

Table altered.
-------------------------

Ograniczenie, jakie nie może być użyte w przypadku dopisywania kolumny do tabeli z danymi, to NOT NULL. Wynika to stąd, że w przypadku dopisywania kolumn w takiej tabeli wartością domyślną dla nowej kolumny jest właśnie null. Nie ma sposobu, aby równocześnie z dodaniem kolumny do tabeli zapełnić ją jakimiś wartościami. Podobnie nie ma też możliwości spełnienia ograniczenia UNIQUE. Jeśli w tabeli istnieją już wiersze, niemożliwe jest dodanie nowej kolumny zawierającej unikalne wartości.
Instrukcja ALTER TABLE może być również wykorzystana, żeby dodać ograniczenia działające na poziomie tabeli. Umożliwia to następująca postać instrukcji:

ALTER TABLE tabela
ADD ([CONSTRAINT nazwa CHECK porównanie]
[kolumny REFERENCES tabela (kolumny)])

Stosując instrukcję ALTER TABLE można dodać takie same ograniczenia dla tabeli, jak podczas jej tworzenia za pomocą instrukcji CREATE TABLE. Przykład wykorzystania instrukcji pokazuje listing 4.25.
-------------------------
Listing 4.25. Instrukcja dodająca nowe ograniczenie dla tabeli

ALTER TABLE Studios
ADD (CONSTRAINT sprawdzenie CHECK (studio_state IN ('TX', 'CA1, 'WA')))

Table alerted.
-------------------------

Przyjrzyjmy się instrukcji ALTER TABLE służącej do modyfikacji kolumn w istniejącej tabeli. , '
Składnia instrukcji jest następująca:

ALTER TABLE nazwa
MODIFY kolumna [typ danych]
[DEFAULT wyrażenie]
[REFERENCES tabela (kolumna)]
[CHECK ograniczenie]
#98
Wyrażenie MODIFY pojawia się w miejsce wyrażenia ADD.

Podstawowa zasada polega na tym, żeby dane już zgromadzone w tabeli odpowiadały definicji kolumny po wprowadzeniu zmian. Na przykład próba zmiany typu danych z VARCHAR na NUMBER nie jest możliwa do wykonania. Również zmniejszenie rozmiaru pola dla typu VARCHAR będzie zakończone niepowodzeniem, jeżeli istniejące dane są dłuższe niż to dopuszcza nowy rozmiar pola.
Listing 4.26 pokazuje przykład wyrażenia, które modyfikuje istniejącą kolumnę. Dodane jest nowe ograniczenie i zmieniono rozmiar pola.
-------------------------
Listing 4.26. Instrukcja modyfikująca definicją kolumny w tabeli
ALTER TABLE People
MODIFY person_union YARCHAR2(10)

Table altered.
-------------------------

W praktyce

Przy tworzeniu relacyjnej bazy danych często pojawia się problem importu danych z innych źródeł. Chociaż niektóre aplikacje nie wymagają, aby do bazy załadować jakieś dane przed rozpoczęciem z nią pracy, to jednak programiści często potrzebują próbnych danych w trakcie pracy nad projektem.
Takie dane umożliwiają sprawdzenie, czy baza danych działa zgodnie z założonym modelem. Pojawia się problem, jak wprowadzić dane do systemu.
Jedna z metod polega na wykorzystaniu omówionej wcześniej instrukcji INSEKT. W przypadku dużych próbek tworzenie odrębnych instrukcji INSEKT jest jednak zbyt czasochłonne i monotonne. Na szczęście jest wiele bardziej wydajnych metod do wykorzystania.
Jeżeli dane, które mają być wprowadzone do systemu, są zgromadzone we właściwie sformatowanym pliku tekstowym, można to zadanie wykonać przy pomocy odpowiedniego programu ładującego.
Większość baz danych jest dostarczana z takimi programami. Niestety, nie ma określonego standardu tych programów choć wiele z nich emuluje działanie programu ładującego z bazy Oracle.
Innym rozwiązaniem jest napisanie własnego programu ładującego. Nie jest to metoda szybka, ale najbardziej elastyczna. Można ją wykorzystać pracując z wieloma różnymi bazami danych. Zwalnia to programistę ze znajomości wielu programów ładujących specyficznych dla każdej relacyjnej bazy danych.
Gdybyśmy jednak chcieli wykorzystać programy ładujące dostarczane wraz z bazą danych, pokażę ich działanie na przykładzie systemu Oracle.
#99
Program ładujący Oracle o nazwie sąlldr używa jednego pliku zawierającego instrukcje i dane, które mają być wprowadzone. Składnia instrukcji jest następująca:

sąlldr użytkownik/hasło control - pllk.ctl

Program sterujący zawiera zarówno instrukcje jak i dane. Zawartość przykładowego pliku pokazuje listing 4.27.
-------------------------
Listing 4.27. Zawartość pliku sterującego

LOAD DATA INFILE *
INTO TABLE Studios
FIELDS TERMINATED BY "|" OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(studio_id, studio_name, studio_city, studio_state)
BEGINDATA
5|"ZODIAK II"|"Huston"|CA
6|"Syrena II"|Burbank|TX
7|MPMIDallas|TX
-------------------------

Chciałbym wyjaśnić działanie instrukcji zawartych w pliku sterującym. Określenie tabeli, do której będą wprowadzone dane, znajduje się po klauzuli INTO TABLE. Znaki używane jako separatory znajdują się w cudzysłowach między danymi, aby nie były w tym miejscu interpretowane jako koniec pola. Poniżej znajduje się lista kolumn odzwierciedlająca kolejność wprowadzanych danych. Instrukcja TRAILING NULLCOLS wskazuje, że jeżeli dla kolumny nie zostały podane wartości, to będzie ona uzupełniana wartościami null. Po słowie kluczowym BEGINDATA pojawia się lista danych.
Każdy systemy baz danych używa innego programu ładującego. Na przykład Microsoft SQL Server ma program o nazwie bcp. W przypadku, gdy chcemy do bazy wprowadzić dużą ilość danych, zalecane jest zapoznanie się z odpowiednim programem ładującym.

Wyszukiwarka

Podobne podstrony:
04 tworzenie stron www
Język SQL usuwanie rekordów ( usuwanie rekordów delete sql kurs mysql ) webmade org
04 tworzenie schematow blokowych
AutoCAD 02 i 04 Tworzenie makr w VBA?dvba(1)
2007 04 Tworzenie kopii bezpieczeństwa danych [Administracja]
Flash MX 04 Tworzenie gier fmx4tg
Rozp zmieniające rozp w sprawie jakości wody przeznaczonej do spożycia przez ludzi 20 04 2010
Brand Equity czyli rynkowe efekty tworzenia marki
04 (131)
2006 04 Karty produktów

więcej podobnych podstron