DML – insert, wstawianie danych

Aby wstawić dane do bazy należy skorzystać z następującej składni:

insert into tabela (nazwy_kolumn... ) values (wartosc);

Na chwilę obecną załóżmy że działamy na przykładowej tabeli przyjaciele i tylko my mamy do niej dostęp. Kwestia współdzielonego dostępu i konsekwencji transakcji zostaną omówione później. W tej części chciałbym się skupić na samej technice ‘wkładania danych’.

tak więc załóżmy że chcemy dodać przyjaciela do naszej tabeli.

insert into przyjaciele (imie,zarobki,plec,kolor) values ('janek','4500','1','5');

Jeśli pracujemy na bazach Mysql,Mssql to wystarczy by wstawić dane. W przypadku bazy Oracle należy wykonać commit;

Commit jest potwierdzeniem zmodyfikowania danych, jeśli coś nam się nie spodoba możemy użyć polecenia Rollback;Te dwa zagadnienia zostaną dokładnie omówione później.

Możemy dane wstawiać także za pomocą zapytań pobierających dane.

insert into przyjaciele (imie,zarobki,plec,kolor)
select 'janek','4500',1,5 from dual

dual jest tabelą oraclową, wyimaginowanym Tworem do zabaw związanych z pobieraniem danych nie z tabel.
W mssql i mysql nie ma tego tworu więc wystarczy:

insert into przyjaciele (imie,zarobki,plec,kolor)
select 'janek','4500',1,5;

można też z innej tabeli:

insert into przyjaciele (imie,zarobki,plec,kolor)
select imie,wynagrodzenie,plec,kolor from starz_przyjaciele;

We wstępie wspomniałem o konieczności wykorzystania kopii zapasowej. Jak najszybciej stworzyc kopie zapasowa tabeli z przyjaciółmi?

select * into kopia_przyjaciol from przyjaciele
na bazie mssql

lub na oracle:

create table kopia_przyjaciol as select * from przyjaciele;

W poprzednich rozdziałach korzystaliśmy z tabeli przyjaciele o takiej definicji:

id int, — unikalny id – pole numeryczne
imie varchar2(255), — pole tekstowe
plec int, — 0 dziewczyna 1 facet — wartosc numeryczna
wiek int, — wiek w latach — wartosc liczbowa
zarobki int, — zarobki w tysiacach — wartosc liczbowa
kolor int); — kolor skory 0 jasny 10 ciemny – skala — wartosc liczbowa

poprzednie zapytania pomijały część kolumn. Tak Jeśli wartość w kolumnie nie jest wymagana w pomienięciu kolumny w insercie powstanie wartość null. O wymagalności wartości w kolumnie napiszę w rozdziale o tworzeniu baz danych.

oczywiście w trakcie insertów możemy korzystać z funkcji podzapytań itd. Wszystkie zasady logiki z pobierania danych muszą zostać spełnione przy insertowaniu.

Istnieje też coś takiego jak wartość domyślna, u nas polem do takiego opisu może być kolumna id.
W większości baz jest to pole które zostanie automatycznie wypełnione wartością przy czym
W zależności od bazy możemy spotkać się z różnymi zachowaniami i nazwami:
Dla mssql słowem wytrych jest autoidentity – przypisanie w insercie wartosci do takiej kolumny zwraca błąd istnieje parametr dzięki któremu możemy chwilowo wyłączyć autoidentity i zainsertować dane. Jest to przydatne przy większych operacjach kopiowania fragmentów baz danych… Autoidentity jest raczej gap free, znaczy się nie powstają tam dziury w numeracji (do momentu usunięcia wiersza).

W mysql – słowem klucz jest Autoincrement. Tutaj w zależności od silnika jaki wykorzystujemy zachowania mogą być różne. Nie zajmuje się Mysql na codzień więc nie będę sie tutaj bawił w eksperta ale mogę odesłać do archiwum grup dyskusyjnych o bazach danych i o języku php słowa kluczowe to Innodb i MyISAM

W oracle sytuacja jest najbardziej zakręcona – Słowo klucz to sekwencja. Jednakże sekwencja musi być powiązana z triggerem(wyzwalaczem). Każdy wyzwalacz jest pisany indiwidualnie więc może się różnie zachowywać. Ja moje wyzwalacze piszę tak że podmieniają bezwzględnie wartość pola id na numer podany przez sekwencję. Omawiane twory nie są gap free (tworzą dziury w numeracji). Plusem jest ich uniwersalność i miła dostępność z poziomu kodu
do właściwości.

Kilka słów odnośnie wyzwalaczy które są już obecne w najpopularniejszych bazach (Mysql > 5.0,Mssql,Oracle).

Wyzwalacz -> Trigger – jest to kod który reaguje na operacje DML (zmiany danych). Triggery nie działają dla selectów). Głównie triggery się wykorzystuje do kontrolowania poprawności i integralności danych, Zapisywania nadpisanych danych oraz w celu rozszerzenia zabezpieczeń.

Triggery mogą w locie nadpisywać wartości które insertujemy, więc insertując np wynagrodzenie 4500
w bazie może zapisać się 2250.

Przed wykonaniem insertów powinniśmy mieć dobrze rozpoznaną bazę na której pracujemy.
Dość miła informacją jest fakt iż jeśli podamy coś źle w zapytaniu mamy nikłe szanse na destrukcje w pryzpadku inserta. Dobrze ustawiona baza nie pozwoli zapisać danych które są niespójne. Przy insertach mamy dość niską szansę na zepsucie czegokolwiek. Oczywiście do momentu jak nie zmieniamy ustawień constraintów czyli wiezów integralności.

Teraz kilka słów o transakcjach. Jest to generalnie temat rzeka, ale kilka podstawowych rzeczy należy wiedzieć. Niestety w każdej bazie jest to realizowane w nieco inny sposób ale poniżej opiszę główne założenia a w szczegóły zagłębię sie przy innej okazji.

Załóżmy że mamy dwóch użytkowników. którzy jednocześnie chcą uzyskać dostęp do danych. Wszystko jest ok
ale jeśli jeden z użytkowników zaczyna modyfikować dane co się dzieje? Wtedy w mniej lub bardziej świadomy sposób otwiera się transakcja. I w zależności od bazy albo użytkownik który chce tylko zapytać o dane dostanie dane niezaktualizowane lub dostanie czerwone światło i będzie musiał poczekać na zakończenie transakcji.

Wstawianie spójnych danych do wielu tabel powinno być świadomie wsadzone w jedną transakcję. O ile jedno zapytanie w większości przypadków tworzy spójną transakcję o tyle 2 zapytania już takiego tworu nie tworzą (przynajmniej w MSSQL i MYSQL). Tak więc insertując np fakturę jako nagłówek i pozycję koniecznie musimy zamknąć to w jedną transakcję(w przypadku gdy mamy gotowe dane). Kolejną sprawą jest minimalizowanie czasu trwania transakcji. Nie można dopuścić do sytuacji gdy transakcja zostaje otwarta i oczekuje na jakiś wybór użytkownika. W takim wypadku należy sprawę rozbić na bardziej atomowe transakcje i zaimplementować mechanizmy zachowujące spójność danych.

Leave a Reply

Your email address will not be published. Required fields are marked *

sixteen − 12 =