Klauzula CONSTRAINT

Ograniczenie (ograniczenie: Warunek nałożony na wartość, jaką można wprowadzić w kolumnie lub wierszu. Na przykład wartości w kolumnie Wiek nie mogą być mniejsze niż 0 ani większe niż 110.) jest podobne do indeksu (indeks: Funkcja, która przyspiesza wyszukiwanie i sortowanie danych w tabeli, korzystając z wartości klucza, i może wymuszać unikatowość wierszy w tabeli. Klucz podstawowy tabeli jest indeksowany automatycznie. Niektóre pola nie mogą być indeksowane z powodu ich typu danych.), chociaż może również służyć do ustanowienia relacji (relacja: Skojarzenie ustanowione między wspólnymi polami (kolumnami) w dwóch tabelach. Relacja może być typu jeden-do-jednego, jeden-do-wielu lub wiele-do-wielu.) z inną tabelą.

Za pomocą klauzuli CONSTRAINT w instrukcjach ALTER TABLE i CREATE TABLE można tworzyć i usuwać ograniczenia. Istnieją dwa typy klauzul CONSTRAINT: jeden z nich pozwala utworzyć ograniczenie dla jednego pola, a drugi — dla większej liczby pól.

 Uwaga   Aparat bazy danych programu Microsoft Access nie obsługuje stosowania instrukcji CONSTRAINT ani żadnych innych instrukcji języka definicji danych (język DDL (Data Definition Language): Język używany do opisu atrybutów bazy danych, a zwłaszcza tabel, pól, indeksów i strategii magazynowania. Definicja standardu ANSI przewiduje używanie do tego celu tokenów CREATE, DROP i ALTER. Język DDL jest podzestawem języka SQL (Structured Query Language).) z bazami danych innymi niż bazy programu Microsoft Access. Zamiast nich należy używać metod Create obiektów DAO (Data Access Objects (DAO): Interfejs dostępu do danych, który komunikuje się ze źródłami danych zgodnymi z aparatem Microsoft Jet oraz ODBC w celu połączenia się z danymi, pobrania danych, operowania nimi lub aktualizacji danych i struktury bazy danych.).

Składnia

Ograniczenie dotyczące jednego pola:

CONSTRAINT nazwa {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES tabela_obca [(pole_tabeli_obcej1, pole_tabeli_obcej2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}

Ograniczenie dotyczące wielu pól:

CONSTRAINT nazwa
{PRIMARY KEY (klucz_podstawowy1[, klucz_podstawowy2 [, ...]]) |
UNIQUE (klucz_unikatowy1[, klucz_unikatowy2 [, ...]]) |
NOT NULL (pole_niepuste1[, pole_niepuste2 [, ...]]) |
FOREIGN KEY [NO INDEX] (odwołanie1[, odwołanie2 [, ...]]) REFERENCES tabela_obca [(pole_tabeli_obcej1 [, pole_tabeli_obcej2 [, ...]])]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}

Klauzula CONSTRAINT zawiera następujące segmenty:

Segment Opis
nazwa Nazwa ograniczenia, które ma zostać utworzone.
klucz_podstawowy1, klucz_podstawowy2 Nazwa pola lub pól, które mają pełnić rolę klucza podstawowego (klucz podstawowy: Jedno lub większa liczba pól (kolumn), których wartości jednoznacznie identyfikują każdy rekord w tabeli. Klucz podstawowy nie dopuszcza wartości Null i zawsze musi mieć unikatowy indeks. Klucz podstawowy służy do wiązania tabeli z kluczami obcymi w innych tabelach.).
klucz_unikatowy1, klucz_unikatowy2 Nazwa pola lub pól, które mają pełnić rolę klucza unikatowego.
pole_niepuste1, pole_niepuste2 Nazwa pola lub pól, które mogą zawierać wyłącznie wartości inne niż Null (Null: Wartość, którą można wprowadzać w polach lub używać w wyrażeniach i kwerendach, aby wskazać brakujące lub nieznane dane. W języku Visual Basic wartość Null wskazuje słowo kluczowe Null. Niektóre pola, takie jak pola klucza podstawowego, nie mogą zawierać wartości Null.).
odwołanie1, odwołanie2 Nazwa pola lub pól pełniących rolę klucza obcego (klucz obcy: Jedno lub większa liczba pól tabeli (kolumn), które odwołują się do pola lub pól klucza podstawowego w innej tabeli. Klucz obcy wskazuje, w jaki sposób tabele są powiązane.), które odwołują się do pola lub pól w innej tabeli.
tabela_obca Nazwa tabeli obcej (tabela obca: Tabela (na przykład Zamówienia) zawierająca pole klucza obcego (na przykład Identyfikator klienta), które jest kluczem podstawowym w innej tabeli (na przykład Klienci) w bazie danych i które zazwyczaj znajduje się po stronie „wielu” relacji jeden-do-wielu.) zawierającej pole lub pola określone parametrem pole_tabeli_obcej.
pole_tabeli_obcej1, pole_tabeli_obcej2 Nazwa pola lub pól w tabeli_obcej opisanej parametrami odwołanie1 i odwołanie2. Tę klauzulę można pominąć, jeśli pole, do którego prowadzi odwołanie, jest kluczem podstawowym tabeli_obcej.
Spostrzeżenia

Składnia ograniczenia dotycząca jednego pola w klauzuli definicji pola w instrukcji ALTER TABLE lub CREATE TABLE powinna być umieszczana natychmiast po specyfikacji typu danych pola.

Składni ograniczenia dotyczącego wielu pól należy używać zawsze w przypadku użycia klauzuli CONSTRAINT zawierającej słowo zastrzeżone (słowo zastrzeżone: Słowo wchodzące w skład języka, takiego jak Visual Basic. Słowami zastrzeżonymi są nazwy instrukcji, wstępnie zdefiniowane funkcje i typy danych, metody, operatory i obiekty.) poza klauzulą definicji pola w instrukcji ALTER TABLE lub CREATE TABLE.

Za pomocą klauzuli CONSTRAINT można przypisywać polom następujące typy ograniczeń:

  • Przy użyciu słowa zastrzeżonego UNIQUE można nadać polu status klucza unikatowego. Oznacza to, że żadne dwa rekordy w tabeli nie mogą mieć wartości takiej, jak podana w tym polu. Ograniczenie unikatowości można zdefiniować dla dowolnego pola lub listy pól. Jeśli klucz unikatowy zostanie ustawiony dla wielu pól, połączone wartości wszystkich pól ujętych w indeksie muszą być unikatowe, nawet jeśli dwa lub więcej rekordów mają taką samą wartość, jak wartość znajdująca się nawet w jednym z pól.
  • Za pomocą słów zastrzeżonych PRIMARY KEY polu lub polom w tabeli można nadać status klucza podstawowego. Wszystkie wartości w kluczu podstawowym muszą być unikatowe i nie mogą mieć wartości Null. W tabeli może istnieć tylko jeden klucz podstawowy.

 Uwaga   Nie należy ustawiać ograniczenia PRIMARY KEY dla tabeli, która już zawiera klucz podstawowy, ponieważ spowoduje to wystąpienie błędu.

  • Za pomocą wyrazów zastrzeżonych FOREIGN KEY można nadać polu status klucza obcego. Jeśli klucz podstawowy tabeli obcej składa się więcej niż z jednego pola, należy użyć definicji ograniczenia dotyczącego wielu pól, podając wszystkie odwołujące się pola, nazwę tabeli obcej oraz nazwy pól tabeli obcej, do których prowadzą odwołania, w takiej samej kolejności, w jakiej są wymienione odwołujące się pola. Jeśli pole lub pola, do których prowadzą odwołania, są kluczem podstawowym tabeli obcej, nie trzeba podawać tych pól. Domyślnie aparat bazy danych zakłada, że klucz podstawowy tabeli obcej to pola, do których prowadzi odwołanie.

Ograniczenia klucza obcego określają konkretne działania, jakie należy podjąć w przypadku zmiany wartości odpowiedniego klucza podstawowego:

  • Działania, jakie mają zostać wykonane na tabeli obcej, można określić na podstawie odpowiednich akcji wykonanych na kluczu podstawowym w tabeli, w której jest zdefiniowana klauzula CONSTRAINT. Załóżmy na przykład, że tabela Klienci została zbudowana w następujący sposób:

CREATE TABLE Klienci (IDklienta INTEGER PRIMARY KEY, PKstatnazwa NCHAR VARYING (50))

Przyjmijmy również, że tabela Zamówienia, która określa relację klucza obcego polegającą na odwołaniu do klucza podstawowego tabeli Klienci, została utworzona przy następujących parametrach:

CREATE TABLE Zamówienia (IDzamówienia INTEGER PRIMARY KEY, IDklienta INTEGER, Uwagidozam NCHAR VARYING (255), CONSTRAINT KOzamIDklienta FOREIGN KEY (IDklienta) REFERENCES Klienci ON UPDATE CASCADE ON DELETE CASCADE

Zarówno klauzula ON UPDATE CASCADE, jak i ON DELETE CASCADE są zdefiniowane w kluczu obcym. Klauzula ON UPDATE CASCADE oznacza, że aktualizacja identyfikatora klienta (IDklienta) w tabeli Klienci zostanie rozpowszechniona w całej tabeli Zamówienia. Każde zamówienie z odpowiednią wartością identyfikatora klienta zostanie automatycznie zaktualizowane o nową wartość. Klauzula ON DELETE CASCADE oznacza, że usunięcie klienta z tabeli Klienci spowoduje usunięcie z tabeli Zamówienia wszystkich wierszy zawierających ten sam identyfikator klienta.

Rozważmy poniższą konstrukcję tabeli Zamówienia, w której akcja CASCADE została zastąpiona akcją SET NULL:

CREATE TABLE Zamówienia (IDzamówienia INTEGER PRIMARY KEY, IDklienta INTEGER, Uwagidozam NCHAR VARYING (255), CONSTRAINT KOzamIDklienta FOREIGN KEY (IDklienta) REFERENCES Klienci ON UPDATE SET NULL ON DELETE SET NULL

Klauzula ON UPDATE SET NULL oznacza, że aktualizacja identyfikatora klienta (IDklienta) w tabeli Klienci spowoduje automatyczne ustawienie wartości NULL dla odpowiednich pozycji klucza obcego w tabeli Zamówienia. Analogicznie klauzula ON DELETE SET NULL oznacza, że usunięcie klienta z tabeli Klienci spowoduje ustawienie wartości NULL dla wszystkich odpowiednich kluczy obcych w tabeli Zamówienia.

Aby zapobiec automatycznemu tworzeniu indeksów dla kluczy obcych, można użyć modyfikatora NO INDEX. Z tej formy definiowania klucza obcego należy korzystać tylko w przypadkach, gdy powstające wartości indeksów mają być często duplikowane. Tam, gdzie dochodzi do częstego duplikowania wartości indeksów kluczy obcych, stosowanie indeksów może być mniej skuteczne niż zwykłe przeszukiwanie tabeli. Utrzymywanie tego rodzaju indeksu, przy wstawianiu i usuwaniu wierszy z tabeli, spowalnia pracę i nie zapewnia żadnych korzyści.

 
 
Dotyczy:
Access 2007