Ograniczenia w tabelach i kolumnach pozwalają wymusić jakość danych. W SQL istnieją dwa sposoby tworzenia ograniczeń w tabeli:inline i poza linią .
W tym artykule zamierzam zbadać te ograniczenia i ich zalety, a także wyjaśnić, który z nich polecam i dlaczego.
Co to jest ograniczenie wbudowane?
Ograniczenie wbudowane to ograniczenie, które deklarujesz w tym samym wierszu co kolumna podczas tworzenia tabeli.
CREATE TABLE employee ( emp_id NUMBER(10) PRIMARY KEY, first_name VARCHAR2(200), last_name VARCHAR2(200), dept_id NUMBER(10) );
W tym przykładzie słowa KLUCZ PODSTAWOWY po kolumnie emp_id wskazują, że emp_id jest kluczem podstawowym.
W związku z tym utworzyliśmy ograniczenie klucza podstawowego w tej kolumnie, dodając słowa kluczowe. Koncepcja jest taka sama niezależnie od typu ograniczenia.
Co to jest ograniczenie poza linią?
Ograniczenie poza wierszem to ograniczenie zadeklarowane w oddzielnym wierszu dla kolumny. Dodajemy go na końcu instrukcji CREATE TABLE.
Na przykład mamy następujący skrypt:
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200), last_name VARCHAR2(200), dept_id NUMBER(10), CONSTRAINT pk_emp PRIMARY KEY (emp_id) );
Jak widać, ustawiliśmy ograniczenie PRIMARY KEY o nazwie pk_emp , do kolumny emp_id na końcu instrukcji.
Ta koncepcja działa w ten sam sposób, niezależnie od typu ograniczenia.
Teraz przeanalizujmy różnicę między tymi dwoma typami ograniczeń, innymi niż te, w których zostały zadeklarowane.
Ograniczenia poza linią mogą mieć określone nazwy
Tworząc ograniczenia poza linią, możemy podać nazwę. Chociaż może się to wydawać stratą czasu, może być pomocne.
Rozważ to na konkretnym przykładzie:
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200), last_name VARCHAR2(200), dept_id NUMBER(10), CONSTRAINT pk_emp PRIMARY KEY (emp_id), CONSTRAINT fk_emp_deptid FOREIGN KEY (dept_id) REFERENCES department (dept_id), CONSTRAINT ck_emp_lnlen CHECK (LENGTH(last_name) > 3) );
Dla kilku ograniczeń określiliśmy następujące nazwy:
- pk_emp
- fk_emp_deptid
- ck_emp_lnlen
Mogłoby się wydawać, że to tylko niepotrzebne pisanie, jednak tak nie jest. Przyjrzymy się temu bliżej.
Dlaczego więc musimy przypisać nazwę do ograniczenia?
Posiadanie nazwanych ograniczeń może być pomocne w kilku sytuacjach. Bez określania nazwy Oracle automatycznie generuje nazwę dla ograniczenia, którą robi dla wszystkich ograniczeń wbudowanych. Zwykle ta nazwa nie dostarcza żadnych przydatnych informacji.
Kiedy pojawiają się błędy w instrukcjach SQL, kodzie PL/SQL lub kodzie aplikacji, dobrze jest użyć nazwy ograniczenia i wiedzieć, do czego ono się odnosi, lub przynajmniej zgadywać. Nazwy takie jak pk_emp lub ck_emp_lnlen będzie bardziej opisowy niż ogólny EMP1290894FH imię.
Ponadto, podczas przeglądania planów wykonania, nazwa ograniczenia jest często używana w danych wyjściowych, co ułatwia ustalenie, w jaki sposób plan jest wykonywany. Zwłaszcza, gdy mamy przypadki określające, czy używany jest klucz podstawowy, czy klucz obcy.
Ograniczenia NOT NULL można zadeklarować tylko w tekście
Istnieje tylko jeden typ ograniczenia, który można zadeklarować jako ograniczenie wbudowane. To jest ograniczenie NOT NULL.
Oznacza to, że nie możesz zadeklarować tego jako niezgodnego.
Wykonaj następujący kod:
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200), last_name VARCHAR2(200) NOT NULL, dept_id NUMBER(10) );
Jednak po uruchomieniu poniższego kodu widzimy, że nie działa:
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200), last_name VARCHAR2(200), dept_id NUMBER(10), CONSTRAINT nn_emp_ln NOT NULL (last_name) );
Podsumowując, w przypadku ograniczeń NOT NULL musimy zadeklarować je inline.
SPRAWDŹ wiązania mogą odnosić się do wielu kolumn
Jeśli utworzysz ograniczenie typu CHECK, może ono odnosić się tylko do kolumny, w której jest tworzone.
Jeśli jednak utworzysz ograniczenie CHECK jako poza linią, może ono odnosić się do wielu kolumn.
Utwórz pracownika tabela z ograniczeniem CHECK, jak pokazano poniżej:
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200) CHECK (LENGTH(first_name) > 10), last_name VARCHAR2(200), dept_id NUMBER(10) );
To ograniczenie pokazuje, że imię i nazwisko musi być dłuższe niż 10 znaków.
A co, gdybyśmy chcieli określić, że kombinacja imienia i nazwiska musi przekraczać 10 znaków?
Aby to zrobić, przepisz kod ponownie jako ograniczenie poza linią:
CREATE TABLE employee ( emp_id NUMBER(10), first_name VARCHAR2(200),, last_name VARCHAR2(200), dept_id NUMBER(10), CONSTRAINT ck_fullname_len CHECK (LENGTH(first_name || last_name) > 10) );
Widzimy, że ta reguła może być zaimplementowana tylko z ograniczeniem poza linią.
Zalecana metoda
Po przeanalizowaniu obu metod:inline lub out-line, zalecam użycie ograniczeń poza linią.
Jest kilka powodów takiego stanu rzeczy.
Po pierwsze, możesz określić nazwę swoich ograniczeń i zobaczyć je w komunikatach o błędach i wewnętrznych planach wykonania. Może również pomóc w wyłączaniu i włączaniu ograniczeń.
Po drugie, ograniczenia sprawdzające umożliwiają odwoływanie się do wielu i pojedynczych kolumn. Dzięki temu jest bardziej elastyczny, jeśli dodasz je jako ograniczenie poza linią.
Wreszcie, posiadanie wszystkich ograniczeń zadeklarowanych jako out of line (z wyjątkiem NOT NULL, które można zdefiniować tylko jako ograniczenie inline) ułatwia przyjrzenie się składni CREATE TABLE i zobaczenie wszystkich ograniczeń w jednym miejscu. Jest to ważne zwłaszcza w przypadku dużych tabel z wieloma ograniczeniami.
Podsumowując, możesz tworzyć ograniczenia za pomocą dwóch różnych metod:w linii i poza linią. Zalecam korzystanie z metody out-of-line tam, gdzie jest to możliwe, ponieważ jest to większa elastyczność i ustawienie nazwy dla ograniczeń, co upraszcza analizę planów wykonania i innych informacji SQL.