Wstawianie danych - INSERT
Aby w SQL dodać dane do tabeli, możemy skorzystać ze słowa kluczowego INSERT. Można tego dokonać na dwa różne sposoby, poprzez:
- dodanie określonych danych wyszególnionych w instrukcji INSERT,
- dodanie danych będących wynikiem instrukcji SELECT.
Zacznijmy od przykładu, w którym pokazano, jak wstawiać dane do tabeli w przypadku, gdy wstawiane wartości są określone w instrukcji INSERT. Załóżmy, że mamy tabelę Kontrahenci, która zawiera już następujące dane:
IDKontrahenta | ImięKontrahenta | NazwiskoKontrahenta | Województwo |
1 | Janusz | Bentlewski | POM |
2 | Michał | Rajewski | MAZ |
3 | Emilia | Pieczyńska | LBU |
Załóżmy również, że pierwsza kolumna w tabeli, IDKontrahenta, jest kluczem głównym. Klucze główne umożliwiają realizację wymagania odnośnie jednoznacznej identyfikacji każdego wiersza w tabeli. Wspomnieliśmy również, że często bywa tak, że kolumny będące kluczem głównym zawierają wartości przyrastające automatycznie. Oznacza to, że każdemu wierszowi dodawanemu do tabeli automatycznie przypisywany jest następny w kolejności numer.
To, że kolumna IDKontrahenta została zdefiniowana jako kolumna, w której wartości przyrastają automatycznie, oznacza, że dodając wiersz do tabeli Kontrahenci, nie musimy precyzować wartości w kolumnie IDKontrahenta. Zostanie ona automatycznie określona, gdy tylko wiersz zostanie dodany do tabeli. Konieczne jest tylko podanie wartości, jakie mają znaleźć się w pozostałych trzech kolumnach.
Spróbujmy zatem dodać dwóch nowych klientów do tabeli Kontrahenci. Będą to: Klaudia Dawidowska z województwa zachodniopomorskiego oraz Irena Krause z województwa opolskiego. Wiersze z danymi wyżej wymienionych kontrahentów dodamy do tabeli za pomocą poniższej instrukcji:
INSERT INTO Kontrahenci
(ImięKontrahenta, NazwiskoKontrahenta, Województwo)
VALUES
('Klaudia', 'Dawidowska', 'ZPM'),
('Irena', 'Krause', 'OPO')
Po dodaniu wierszy tabela Kontrahenci zawiera następujące dane:
IDKontrahenta | ImięKontrahenta | NazwiskoKontrahenta | Województwo |
1 | Janusz | Bentlewski | POM |
2 | Michał | Rajewski | MAZ |
3 | Emilia | Pieczyńska | LBU |
4 | Klaudia | Dawidowska | ZPM |
5 | Irena | Krause | OPO |
Przyjrzyjmy się teraz dokładniej naszej instrukcji. Po pierwsze, zauważ, że słowo kluczowe VALUES znajduje się przed listą wartości, które mają być umieszczone w tabeli. Każdy z wierszy, który ma zostać wstawiony, został umieszczony w oddzielnym zestawie nawiasów. Klaudia Dawidowska z województwa zachodniopomorskiego została wstawiona w jednym zestawie nawiasów, zaś Irena Krause w drugim. Oba zestawy nawiasów oddzielone zostały przecinkiem. Gdybyśmy chcieli dodać tylko jeden wiersz, potrzebny byłby nam zestaw danych do wstawienia ujęty w jeden zestaw nawiasów.
RÓŻNICE W RAMACH INNYCH BAZ DANYCH: Oracle
W Oracle nie jest możliwe umieszczenie po słowie kluczowym VALUES wartości kilku wstawianych wierszy. Powyższy przykład musiałby zatem zostać rozdzielony na dwie oddzielne instrukcje:
INSERT INTO Kontrahenci
(ImięKontrahenta, NazwiskoKontrahenta, Województwo)
VALUES
('Klaudia', 'Dawidowska', 'ZPM');
INSERT INTO Kontrahenci
(ImięKontrahenta, NazwiskoKontrahenta, Województwo)
VALUES
('Irena', 'Krause', 'OPO');
Zauważ również, że kolejność elementów danych po słowie kluczowym VALUES odpowiada kolejności kolumn wymienionych na liście_kolumn po słowie INSERT INTO. Kolejność, w jakiej zostały wymienione kolumny, nie musi być taka sama, jak w tabeli znajdującej się w bazie danych. Innymi słowy, powyższa instrukcja równie dobrze mogłaby mieć następującą postać:
INSERT INTO Kontrahenci
(Województwo, NazwiskoKontrahenta, ImięKontrahenta)
VALUES
('ZPM', 'Dawidowska', 'Klaudia'),
('OPO', 'Krause', 'Irena')
W powyższej instrukcji INSERT kolumna Województwo została wymieniona jako pierwsza, a nie, jak poprzednio, jako ostatnia. Tak jak przed chwilą powiedzieliśmy, kolejność, w której kolumny są wymieniane, nie ma znaczenia.
Podsumowując, ogólny format instrukcji INSERT INTO ma zatem postać:
INSERT INTO tabela
(lista_kolumn)
VALUES
(WartościWiersza1),
(WartościWiersza2)
(powtórz dowolną liczbę razy)
Kolumny na liście_kolumn muszą odpowiadać wartościom zdefiniowanym w elemencie WartościWiersza.
Ponadto, jeśli wszystkie kolumny na liście_kolumn wymienione są w tej samej kolejności, w jakiej istnieją fizycznie w bazie danych, oraz jeśli w tabeli nie istnieją kolumny z automatycznym przyrostem wartości, wówczas instrukcja INSERT INTO może zostać wykonana bez podawania listy_kolumn. Takie podejście nie jest jednak zalecane ze względu na większe prawdopodobieństwo popełnienia błędu.
Możemy również pominąć niektóre kolumny w instrukcji INSERT. Wówczas zostanie do nich wstawiona wartość NULL. Na przykład, powiedzmy, że chcemy wstawić jeden dodatkowy wiersz do tabeli Kontrahenci. Będzie on zawierał dane Dawida Grabowskiego. Nie wiemy jednak, z jakiego województwa klient ten pochodzi. Instrukcja INSERT będzie wyglądała tak jak poniżej:
INSERT INTO Kontrahenci
(ImięKontrahenta, NazwiskoKontrahenta)
VALUES
('Dawid', 'Grabowski')
Wiersz zawierający dane tego klienta będzie miał w tabeli następującą postać:
IDKontrahenta | ImięKontrahenta | NazwiskoKontrahenta | Województwo |
6 | Dawid | Grabowski | NULL |
Ponieważ nie określiliśmy, jaka wartość powinna znaleźć się w kolumnie Województwo w przypadku tego nowego wiersza, wstawiona została wartość NULL.
Jak wspomnieliśmy na początku tego rozdziału, istnieją dwa warianty instrukcji INSERT INTO. Drugi format odnosi się do sytuacji, w których wstawiane do tabeli dane są wynikiem instrukcji SELECT. Oznacza to, że zamiast wymieniać wartości po słowie kluczowym VALUES, do uzyskania wartości, które mają zostać wstawione do tabeli, wykorzystywana jest instrukcja SELECT.
Aby to pokazać, powiedzmy, że mamy do dyspozycji kolejną tabelę, o nazwie NowiKontrahenci, zawierającą dane, które chcielibyśmy wstawić do tabeli Kontrahenci. Tabela NowiKontrahenci wygląda następująco:
Województwo | Nazwa1 | Nazwa2 |
PKR | Robert | Hołdys |
MAZ | Beata | Kowalska |
PKR | Grażyna | Mielniczuk |
Aby dodać do tabeli Kontrahenci dane wszystkich klientów z tabeli NowiKontrahenci pochodzących z województwa podkarpackiego (PKR), należałoby zastosować poniższą instrukcję:
INSERT INTO Kontrahenci
(ImięKontrahenta, NazwiskoKontrahenta, Województwo)
SELECT
Nazwa1,
Nazwa2,
Województwo
FROM NowiKontrahenci
WHERE Województwo = 'PKR'
Po wykonaniu tej instrukcji INSERT tabela Kontrahenci zawiera teraz następujące dane:
IDKontrahenta | ImięKontrahenta | NazwiskoKontrahenta | Województwo |
1 | Janusz | Bentlewski | POM |
2 | Michał | Rajewski | MAZ |
3 | Emilia | Pieczyńska | LBU |
4 | Klaudia | Dawidowska | ZPM |
5 | Irena | Krause | OPO |
6 | Dawid | Grabowski | NULL |
7 | Robert | Hołdys | PKR |
8 | Grażyna | Mielniczuk | PKR |
W powyższej instrukcji INSERT prezentowana wcześniej klauzula VALUE została zastąpiona instrukcją SELECT. Jak można się było spodziewać, wiersz z danymi Beaty Kowalskiej nie został dodany do tabeli Kontrahenci, ponieważ klientka ta nie pochodzi z województwa podkarpackiego. Zauważ również, że nazwy kolumn w tabelach Kontrahenci oraz NowiKontrahenci nie są identyczne. Nazwy kolumn nie mają jednak znaczenia, dopóki kolumny są wymieniane w prawidłowej kolejności i odpowiadają sobie w obu wspomnianych tabelach.
Język SQL. Przyjazny podręcznik. Wydanie II Autor: Larry Rockoff Wydawnictwo: Helion