Jak dodać rekord do tabeli komendą INSERT języka SQL?
Wstęp

Masz dostęp do dowolnej bazy danych. Czyli masz konto, hasło, klienta, połączenie i nie wahasz się ich użyć. W bazie danych istnieje tabela do której masz uprawnienia do wstawiania rekordów. Jeśli nie masz takich uprawnień to poproś admina aby Ci je nadał. 

Jeśli nie masz takiej tabeli to zaraz pokażę jak stworzyć przykładową, a Ty ogarnij bazę danych w której masz prawo tworzyć tabele. 

Przykładowa tabela

Ja używam darmowej wersji Oracle 19c dostępnej na livesql.

Tworzę tabelę t o trzech kolumnach: jedna numeryczna, jedna tekstowa i jedna datoczasowa. Pokażę o co trzeba zadbać wstawiając dane każdego z tych trzech podstawowych typów. Tabelą t będę posługiwał się w dalszej części materiału. 

CREATE TABLE t ( 
    kolumna_numeryczna NUMBER PRIMARY KEY, 
    kolumna_znakowa    CHAR, 
    kolumna_datowa     DATE DEFAULT sysdate 
);

Tworzenie pójdzie smukle jeśli masz prawo tworzenia tabel w bazie danych. Stworzona tabela należy do Ciebie, więc masz uprawnienia do wstawiania rekordów. Dzięki temu, że wiesz jaką komendą utworzono tabelę wiesz jak nazywają się kolumny, jakiego są typu i czy dozwalają NULLe. Jak to jest istotne pokażę dalej. 

Zastana tabela

Inną sytuacją jest gdy chcesz wstawić rekordy do istniejącej tabeli. Nie zawsze znasz jej strukturę. W takim przypadku graficzny klient jest dużym ułatwieniem. Wszystko możesz odkryć klikając w odpowiednie elementy drzewa struktury.

Schemat tabeli t widziany narzędziami livesql

Jeśli korzystasz z klienta znakowego z pomocą przychodzą polecenia przygotowane przez jego producenta. Na przykład korzystając z klienta Oracle użyj polecenia DESCRIBE (w skrócie DESC) <nazwa tabeli>.

Schemat tabeli t jako wynik komendy DESC

Czegokolwiek nie używasz to zwróć uwagę kto jest właścicielem tabeli. Innymi słowy w jakim schemacie została utworzona. Jeśli chcesz używać tabeli należącej do innego niż Twój schematu to nazwę tabeli poprzedź nazwą schematu. Swoją drogą poprzedzanie nazwy tabeli nazwą schematu, nawet gdy Twój, to dobry i zdrowy zwyczaj. Warto go wyhodować i stale pielęgnować. 

Najprościej

Aby wstawić rekordy do tabeli relacyjnej bazy danych posługujesz się komendą INSERT języka SQL. A dokładnie INSERT INTO. W najprostszej formie może wyglądać tak:

INSERT INTO t ( kolumna_numeryczna ) VALUES ( 1 );

Po klauzuli INSERT INTO podajesz nazwę tabeli. Kolejno, w nawiasach okrągłych, wymieniasz listę kolumn. Następna jest klauzula VALUES i w nawiasach okrągłych umieszczasz wartości. Wartości podajesz w kolejności takiej samej jak podajesz kolumny.  Czyli pierwsza wartość zostanie wstawiona do pierwszej kolumny. Jeśli wszystko pójdzie smukle to zobaczysz potwierdzenie wstawienia rekordu. 

Potwierdzenie wstawienia rekordu do tabeli t

Oracle wymaga podania listy kolumn po nazwie tabeli jeśli nie podajesz wartości dla wszystkich kolumn tabeli.

Błąd zwracany przez Oracle gdy lista kolumn nie odpowiada liście wartości w komendzie INSERT

Zwróć uwagę, że w komendzie INSERT podałem tylko jedną wartość mimo iż tabela t ma trzy kolumny. Jak sądzisz dlaczego nie musiałem podawać wartości dla pozostałych dwóch kolumn? Masz rację pozostałe dwie kolumny dozwalają NULLe. Czyli brak wartości.

Schemat tabeli t z zaznaczonymi kolumnami dozwalającymi NULLe

Dlatego ważna jest znajomość schematu tabeli. Trzeba wiedzieć wartości których kolumn mogą zostać pominięte podczas wstawiania. Kolumna numeryczna nie dozwala NULLi, więc wartość dla niej musisz podać. 

Jeśli tabela jest w innym schemacie niż Twój to poprzedź jej nazwę nazwą schematu i rozdziel kropką. 

INSERT INTO schemat.t ( kolumna_numeryczna ) VALUES ( 1 );
Weryfikacja 

Czasem chcesz sprawdzić czy dane zostały wstawione zgodnie z intencjami. Możesz to zrobić poleceniem SELECT.

SELECT 
    * 
FROM 
    t;

Trzeba pamiętać, że część klientów automatycznie zatwierdza transakcje. Czyli za Ciebie wykonuje komendę COMMIT. Niemniej możesz trafić na klienta, który tego nie robi. Dlatego aby mieć pewność, że rekord został utrwalony w bazie danych, wydaj komendę COMMIT własnoręcznie. Wtedy unikniesz zdziwienia, że wstawiasz rekordy, a nie ma ich w tabeli. 

Zwróć uwagę, że w kolumnie datowej, mimo, że nic do niej nie wstawiałem, znajduje się data. 

Sprawdzenie poprawności wstawienia rekordu

Jest to efekt działania więzu integralności DEFAULT. W tym przypadku wartość domyślna generowana jest z wyniku niejawnego wywołania funkcji sysdate zwracającej bieżącą datę. Dzieje się tak za każdym razem gdy nie podasz wartości dla kolumny z takim więzem. 

Dane znakowe 

Jak widzisz dane numeryczne są najprostsze do wstawienia. Łańcuchy znaków, natomiast, trzeba otoczyć apostrofami. 

INSERT INTO t ( 
    kolumna_numeryczna, 
    kolumna_znakowa 
) VALUES ( 
    2, 
    'M'
);

Jak sądzisz dlaczego wstawiłem tylko jedną literę jako napis? Masz rację, bo na schemacie tabeli wyraźnie widać, że w kolumnie zmieści się tylko jeden znak. 

Schemat tabeli t z zaznaczonym typem kolumny znakowej

Gdy wstawiasz do tabeli znaki narodowe dowolnego języka, na przykład nasze ogonki czy niemieckie umlały, to zwróć uwage na ustawienia narodowe swojego klienta, motoru bazy danych oraz typ kolumny. 

INSERT INTO t ( 
    kolumna_numeryczna, 
    kolumna_znakowa 
) VALUES ( 
    3, 
    'ł' 
);

Jak widzisz ja dostałem błąd. 

Błąd zwracany przez Oracle gdy wstawiany napis nie mieści się kolumnie

Zdefiniowałem kolumnę znakową jako char(1). Czyli mieszczącą jeden bajt. 

Schemat tabeli t z zaznaczonym typem kolumny znakowej

Aby pomieściła polskie znaki w zdefiniowanej ilości muszę zdefiniować ją jako przechowującą jeden znak. 

ALTER TABLE t MODIFY 
    kolumna_znakowa CHAR(1 CHAR);

Teraz wstawienie ł powiodło się. 

Komunikat o poprawnym wstawieniu rekordu

Klient i motor bazy danych muszą mieć świadomość jak interpretować bajty, które przesyłasz. Więcej na ten temat przeczytasz w moim artykule ’NVARCHAR – 2 powody istnienia’.

Dane datoczasowe

Dane datoczasowe to także łańcuch znaków. Czyli oprócz liczb zawiera znaki specjalne, spacje i litery. Możesz, więc się domyśleć, że muszą być otoczone apostrofami. 

Dane datoczasowe muszą być odpowiednio sformatowane aby motor bazy danych poprawnie dokonał konwersji łańcucha znaków na typ datoczasowy. Taka konwersja nazywana jest konwersją niejawną.

Niemniej, aby uniknąć niedomówień i nieporozumień z motorem baz danych oraz zapewnić większą przenaszalność kodu warto konwertować jawnie. 

INSERT INTO t (
    kolumna_numeryczna,
    kolumna_datowa
) VALUES (
    4,
    DATE '1972-05-20'
);

Użycia słowa kluczowego DATE do konwersji jawnej jest zgodne ze standardem ANSI. Standard wymusza określony format literału datoczasowego.

Oprócz standardowego DATE każdy motor baz danych wyposażony jest w natywne funkcje konwertujące. Na przykład to_date w Oracle. 

INSERT INTO t (
    kolumna_numeryczna,
    kolumna_datowa
) VALUES (
    5,
    TO_DATE('72-05-20 11:23:54', 'YY-MM-DD HH24:MI:SS') 
);

Jak widzisz funkcja to_date jest bardziej elastyczna niż standardowe DATE. Format daty przekazujesz jako drugi parametr. Wszystkie możliwe formaty opisane są w dokumentacji.

Jawnie podając wartość kolumny datowej nie uruchamiasz więzu integralności DEFAULT. 

Wskazanie kolumn

Nawet jeśli Twój motor bazy danych nie wymaga podawania listy kolumn do których wstawiasz wartości zachęcam aby tak robić. Jak sądzisz dlaczego warto wskazywać kolumny? 

Baza danych to żywy organizm. Oprócz zmian w danych zmienia się sam schemat. Kolumn w tabeli może ubyć, przybyć albo mogą zmienić kolejność. Jawne wskazywanie kolejności kolumn zabezpiecza przed zmianami schematu.

INSERT INTO t (
    kolumna_znakowa,
    kolumna_numeryczna
) VALUES (
    'N',
    6
);

Jest także bardziej czytelne.

Podobnie jawne wskazanie NULL czy DEFAULT poprawia czytelność komendy.

INSERT INTO t (
    kolumna_znakowa,
    kolumna_numeryczna,
    kolumna_datowa
) VALUES (
    NULL,
    7, DEFAULT
);

Osoba widząca komendę INSERT od razu wie co jest wstawiane do jakiej kolumny.

Podsumowanie

Z tego materiału wiesz jak dodawać pojedyncze rekordy, do relacyjnej tabeli przy pomocy SQL w najprostszy sposób.

Wiesz także jak znaleźć schemat tabeli aby wiedzieć jakiego typu jest kolumna oraz czy dozwala NULLe.

Zaprezentowałem jak wstawiać dane typu numerycznego, znakowego oraz datoczasowego. 

Niebawem materiały o wstawianiu wielu rekordów na raz oraz o wstawianiu masowym.

Jeśli interesuje Cię wstawianie z uwzględnieniem więzów intergralności oraz wyzwalaczy czyli angielskich triggerów to daj znać w komentarzu.

Marcin Badtke

Przyjaźnie o SQL, bazach danych i ludziach

Może Ci się spodobać...

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *