Encyklopedia SQL - Dodawanie danych - INSERT  

Udostępnij na: Facebook

Autor: Paweł Wilkosz

Opublikowano: 2012-01-25

Do tej pory cykl Encyklopedia SQL skoncentrowany był na sposobach ekstrakcji danych z poszczególnych tabel oraz na wykorzystaniu mechanizmów ograniczania zbioru kolumn i rekordów. W tej części skoncentrujemy się na technice wstawiania informacji do bazy danych. Niniejsza publikacja opisywać będzie polecenie INSERT INTO jako jedną z kilku metod dodawania nowych rekordów.

Przed wykonaniem zadań zapoznaj się z następującym materiałem:

Po wykonaniu zadań będziesz wiedział:

  • w jaki sposób wstawiać dane do tabeli za pomocą wyrażenia INSERT INTO.

Polecenie INSERT INTO

INSERT INTO jest podstawowym poleceniem, które służy do wstawiania nowych informacji do bazy danych. W najprostszej postaci zapytanie, wykorzystujące niniejszy operator, przyjmuje następującą składnię:

INSERT INTO tablica_lub_widok (nazwy_kolumn)
VALUES (wartości_odpowiadające_typom_kolumn)

Aby lepiej zrozumieć zasadę konstruowania zapytań z INSERT INTO, posłużymy się następującym przykładem. Tabela Person.Address bazy Adventure Works zawiera zdefiniowane adresy korespondencyjne poszczególnych pracowników. Zakładając, iż firma rozszerza ekspansję sprzedaży na rynki europejskie, w AdventureWorks została zatrudniona osoba z Polski. Zatem konieczne jest dodanie adresu tej osoby do ogólnej bazy danych. Aby wprowadzić miejsce zamieszkania nowego pracownika do tabeli Person.Address, należy wykonać następujące zapytanie:

INSERT INTO Person.Address (AddressLine1, City, StateProvinceID, PostalCode)
VALUES (‘Warszawa’,’Al.Jerozolimskie’,’Warszawa’,79,22-222)

Jeżeli zapytanie wykonało się poprawnie, użytkownik powinien otrzymać komunikat w postaci:

(1 row(s) affected)

co dokładnie niesie za sobą informacje, ile rekordów uległo modyfikacji w wyniku przeprowadzonej operacji. Ogólny rezultat wykonania zapytania został przedstawiony na Rys. 1.

Rys. 1. Wynik działania zapytania INSERT INTO.

Aby upewnić się, iż informacja o nowym adresie zamieszkania została umieszczona w bazie danych, można wyświetlić rekordy znajdujące się w tabeli Person.Address za pomocą instrukcji SELECT. Łatwo zauważyć, iż wpis znajduje się na końcu zbioru wynikowego (Rys. 2.). Jest to związane z wewnętrznym mechanizmem rozmieszczania danych w plikach bazodanowych, zarządzanych przez serwer bazodanowy.

Rys.2. Sprawdzenie rezultatu działania zapytania INSERT INTO.

Oprócz kolumn do wypełnienia, które zostały wskazane przez programistę baz danych, inne spośród nich (np. rowguid, ModifiedDate) również zostały wzbogacone o wpisy. Jest to związane z tzw. wartościami domyślnymi, które są zdefiniowane dla kolumn. Jeżeli zapytanie nie wskazuje na umieszczenie pod tymi kolumnami konkretnych informacji, wartości domyślne są nanoszone w ich miejsce.

Polecenie INSERT INTO dla wielu rekordów

O ile umieszczenie pojedynczego rekordu w bazie danych nie jest wielkim kłopotem, o tyle wpisanie 20 wierszy i opatrywanie każdego z osobna słowami kluczowymi INSERT INTO, mogłoby wpłynąć negatywnie na czytelność kodu oraz komfort pracy programisty. W związku z tym język T-SQL, od wersji SQL Server 2008, oferuje skrócony zapis wprowadzania wielu rekordów w pojedynczym zapytaniu z INSERT INTO. Zamiast pojedynczych wartości składnia zapytania przyjmuje tablicę danych, czyli:

INSERT INTO tablica_lub_widok (nazwy_kolumn)
VALUES 
(tablica_danych_dla_kolumn_1), 
(tablica_danych_dla_kolumn_2),
…(tablica_danych_dla_kolumn_N))

Powracając do omawianego w niniejszej publikacji przykładu, można założyć, iż firma AdventureWorks zdecydowała się przyjąć jeszcze trzech pracowników z Polski. Aby dodać ich adresy korespondencyjne do bazy danych w jednym poleceniu SQL, wykonaj następujące zapytanie:

INSERT INTO Person.Address (AddressLine1, City, StateProvinceID, PostalCode)
VALUES
('Warszawa ul. Szeroka', 'Warszawa', 79, 22-222),
('Krakow Al. Mickiewicza', 'Krakow', 78, 22-211),
('Poznan ul. Dluga', 'Poznan', 77, 22-233)

Tym razem raport z wykonanej operacji powinien wskazywać na modyfikację 3 rekordów (Rys. 3.).

Rys. 3. Wstawianie wielu rekordów w jedym zapytaniu INSERT INTO.

Wykonując polecenie SELECT na bazie danych, łatwo zauważyć, iż rekordy zostały poprawnie umieszczone we wskazanej tabeli, zgodnie z Rys. 4.

Rys. 4. Wynik działania INSERT INTO z wieloma rekordami.

Typowe błędy

Podczas pracy z instrukcją INSERT INTO, niejednokrotnie możesz spotkać sytuacje, w których wynik zapytania nie będzie wskazywał na liczbę zmodyfikowanych rekordów, ale na kod błędu z odpowiednią wiadomością. Najczęściej sytuacja ta spowodowana będzie próbą wstawienia danej innego typu, niż wymaga tego kolumna. Lista najczęstszych błędów została przedstawiona w tabeli 1.

Tabela 1. Lista najczęstszych błędów pojawiających się podczas pracy z INSERT INTO.

Kod błędu Wiadomość Komentarz
245 Conversion failed when converting the varchar value 'asd' to data type int. Próba wstawienia danej typu znakowego do kolumny numerycznej.
109 There are more columns in the INSERT statement than values specified in the VALUES clause. Liczba kolumn wymienionych po INSERT INTO nie zgadza się z ilością danych wskazanych po słowie kluczowym VALUES.
515 Cannot insert the value NULL into column 'XXX', table 'YYY’; column does not allow nulls. INSERT fails. Kolumna XXX w tabeli YYY jest obowiązkowa. Zatem wstawianie rekordów do tejże tabeli wymaga zdefiniowania danej XXX.
1007 The number 'XXX' is out of the range for numeric representation. Numer XXX przekroczył zakres przewidziany dla reprezentacji numerycznej.
547 The INSERT statement conflicted with the FOREIGN KEY constraint FK_KEY. Wprowadzane dane są w konflikcie z kluczem obcym danej tabeli.

 

Informacja

Zapamiętaj, że:

  1. Klauzula INSERT INTO służy do wstawiania danych do tabeli oraz wskazanych kolumn w jej ramach .
  2. T-SQL oferuje możliwość wstawiania wielu rekordów w pojedynczym zapytaniu INSERT INTO.

Podsumowanie

W tej części Encyklopedii SQL poznałeś sposób wstawiania rekordów do bazy danych za pomocą polecenia INSERT INTO wraz z jego rozszerzeniami. Zapoznałeś się również z błędami, jakie można otrzymać, gdy zapytanie jest źle skonstruowane semantycznie.

W kolejnej publikacji nauczysz się modyfikować dane za pomocą klauzuli UPDATE.

Dodatkowo zobacz: