Podstawy INSERT – komendy języka SQL. Używasz jej gdy wstawiasz nowe dane do istniejącej tabeli w relacyjnej bazie danych. W niniejszym artykule zaprezentuję Ci podstawowe sposoby użycia tej komendy.
Najprościej
Najprostsza postać komendy INSERT wygląda tak:
INSERT INTO tabela VALUES (1);
Komenda wstawi wartość 1 do tabeli o nazwie 'tabela’. Tabela 'tabela’ musi istnieć. Jej pierwsza kolumna musi być typu numerycznego. Konto, którym łączysz się do bazy danych, musi mieć prawo wstawiania do tabeli rekordów. Inaczej dostaniesz komunikat o błędzie.
Jeśli używasz SQL Developera i wszystko pójdzie smukle to zobaczysz informację podobną do tej:

W powyższym przykładzie nie wskazałem do jakiej kolumny wartość ma zostać wstawiona. Motor bazy danych domyślnie wstawi ją do pierwszej kolumny.
Wskazywanie nazw kolumn nie jest obowiązkowe. Gdy tego nie robisz musisz zadbać aby lista wartości miała tę samą kolejność co kolejność kolumn w tabeli.
Jeśli tabela ma więcej kolumn niż jedną to w Oracle dostaniesz błąd. PostgreSQL wykona komendę poprawnie.
Specyfikowanie kolejności kolumn
Bezpieczniej jest wskazać do jakiej kolumny chcesz wstawić dane. Robisz to tak:
INSERT INTO tabela(kolumna_numeryczna) VALUES (1);
Tabele w bazie danych, od czasu do czasu, są modyfikowane. Na skutek zmian w aplikacji kolumn przybywa, ubywa lub zmieniają kolejność.
Gdy, w komendzie INSERT, jawnie wskażesz kolejność kolumn masz gwarancję, że właściwe wartości zostaną wstawione do odpowiednich kolumn. Niezależnie od zmian w kształcie tabeli.
Podając jawnie nazwy kolumn nie musisz przestrzegać porządku w jakim były tworzone w tabeli. Możesz podać je w dowolnej kolejności:
INSERT INTO tabela (kolumna_ostatnia, kolumna_pierwsza, kolumna_środkowa) VALUES (10, 0, 5);
Grupowanie komend INSERT
UWAGA! Aby dane zostały zapisane w bazie danych po komendzie INSERT
należy wydać komendę COMMIT
. Niektóre narzędzia klienckie robią to w tle. Niejawnie. Bezpieczniej nie pokładać zaufania w takim zachowaniu i jawnie wydawać komendę COMMIT
.
Komendy INSERT
możesz łączyć w grupy:
INSERT INTO tabela (kolumna_numeryczna) VALUES (1); INSERT INTO tabela (kolumna_numeryczna) VALUES (2); INSERT INTO tabela (kolumna_numeryczna) VALUES (3); COMMIT;
Jeśli nie chcesz aby dane zostały w bazie danych zapisane wydaj komendę ROLLBACK
.
INSERT INTO tabela (kolumna_numeryczna) VALUES (1); INSERT INTO tabela (kolumna_numeryczna) VALUES (2); INSERT INTO tabela (kolumna_numeryczna) VALUES (3); ROLLBACK;
Zanim wydasz komendę COMMIT
lub ROLLBACK
możesz sprawdzić czy dane zostały wstawione poprawnie. Po komendzie INSERT
wydaj komendę SELECT
. Po zapoznaniu się z danymi zdecyduj czy mają w bazie zostać czy trzeba je wycofać.
INSERT INTO tabela (kolumna_numeryczna) VALUES (1); SELECT * FROM tabela; COMMIT;
Powyższe komendy sprawdzą się w Oracle. Ten motor niejawnie rozpoczyna transakcję w momencie gdy rozpoczyna wykonanie komendy SQL. Transakcja trwa do momentu gdy zakończysz ją jawnie komendą COMMIT lub ROLLBACK. Albo niejawnie zakończy ją za Ciebie klient którego używasz. Na przykład sqlplus wyda niejawny COMMIT w momencie intencyjnego wyjścia z niego.
Z drugiej strony klient PostgreSQL psql zleca niejawny COMMIT po każdej komendzie SQL.
Warto sprawdziać ustawienia autocommit swojego klienta.
Wstawianie danych znakowych i datoczasowych
Dane tekstowe trzeba wziąć w apostrofy:
INSERT INTO tabela (kolumna_numeryczna, kolumna_znakowa) VALUES (1, 'napis');
Podczas wstawiania danych znakowych warto zwrócić uwagę czy zestaw znaków klienta mieści się w zestawie znaków bazy danych. Na przykład: czy klient potrafi wysłać do bazy danych nasze znaki narodowe: 'ąśżźćł’? No i czy baza danych jest w stanie je przechować.
Więcej na ten temat w następnym artykule.
Daty, z postaci znakowej, bezpieczniej, przed wstawieniem, jawnie skonwertować do typu datowego. Możesz konwertować używając składni ANSI:
INSERT INTO tabela (kolumna_datowa) VALUES (date'2022-05-26');
Komenda SQL standardu ANSI date
skonwertuje literał '2022-05-26′ do typu date. Zadziała w każdym motorze z zaimplementowanym standardem SQL. Czyli w większości wiodących jak Oracle, PostgreSQL, MySQL i SQL Server. Istotne aby literał podany był w formacie 'RRRR-MM-DD’.
Do konwersji daty i czasu możesz użyć komendy timestamp
w taki sposób:
INSERT INTO tabela (kolumna_timestamp) VALUES (timestamp'2022-05-20 12:23:43');
Czyli akceptowany format to 'RRRR-MM-DD HH24:MI:SS’.
Wstawianie NULL i wartości domyślnej
Kolejność wartości w klauzuli VALUES
musi odpowiadać kolejności kolumn po nazwie tabeli. Gdy brakuje jakiejś wartości możesz spróbować zastąpić ją NULL.
INSERT INTO tabela (kolumna_numeryczna, kolumna_znakowa) VALUES (1, NULL);
Jeśli kolumna nie dozwala NULL
dostaniesz komunikat o błędzie. W Oracle będzie wyglądał podobnie do: 'ORA-01400: cannot insert NULL into …’.
A w PostgreSQL tak: 'ERROR: null value in column … of relation … violates not-null constraint’.
O ile Twoja baza jest skonfigurowana na język angielski.
Przetestuj używając swojej bazy danych. Stwórz tabelę przy pomocy tej komendy:
CREATE TABLE tabela( kolumna_numeryczna int default 7 ,kolumna_znakowa char(5) not null );
A później wykonaj wcześniejszą komendę INSERT.
Brakujące wartości możesz także zastąpić wartością domyślną:
INSERT INTO tabela (kolumna_numeryczna, kolumna_znakowa) VALUES (DEFAULT, 'napis');
Jeśli dysponujesz utworzoną tabelą 'tabela’ z poprzedniego akapitu, wykonaj powyższą komendę SQL. A następnie sprawdź co znajduje się w tabeli:
SELECT * FROM tabela;
Wynik powyższego zapytania powinien wyglądać podobnie do mojego. Jeśli używasz SQL Developer:

Możesz pominąć kolumnę, która wartość domyślną ma zdefiniowaną.
W Oracle dostaniesz błąd: 'ORA-00947: not enough values’ jeśli lista kolumn nie pokrywa się z listą wartości.
Jeśli nie potrzebujesz już tabeli 'tabela’ to usuń ją tą komendą:
DROP TABLE tabela;
Wstawianie danych do cudzej tabeli
Czasem masz potrzebę wstawienia danych do tabeli, która nie należy do Ciebie. Wtedy nazwę tabeli, w komendzie INSERT, musisz poprzedzić nazwą schematu w którym została utworzona. Robisz to tak:
INSERT INTO marcin.tabela (kolumna_numeryczna) VALUES (7);
Wpisujesz nazwę schematu, kropkę i nazwę tabeli. W moim przypadku nazwą schematu jest 'marcin’. Gdy wstawiasz dane do tabeli należącej do Ciebie nie musisz tego robić bo motor bazy danych dopisuje nazwę za Ciebie.
Musisz mieć uprawnienia do wstawiania danych do cudzej tabeli. Inaczej dostaniesz błąd.
Tutaj znajdziesz mój artykuł o wielorekordowym INSERT: Jak, jednym INSERT, wstawić do bazy danych wiele rekordów?
Prowadzę szkolenia i kursy z podstaw SQL. Sprawdź ofertę moich kursów SQL.