Uma restrição é semelhante a um índice, embora também possa ser utilizada para estabelecer uma relação com outra tabela.
Utilize a cláusula CONSTRAINT nas instruções ALTER TABLE e CREATE TABLE para criar ou eliminar restrições. Existem dois tipos de cláusulas CONSTRAINT: uma para criar uma restrição num único campo e outra para criar uma restrição em mais do que um campo.
Observação
O motor de base de dados do Microsoft Access não suporta a utilização de CONSTRAINT ou qualquer uma das instruções de linguagem de definição de dados, com bases de dados que não sejam do Microsoft Access. Use os métodos DAO Create.
Sintaxe
Restrição de campo único:
Nome da RESTRIÇÃO {CHAVE PRIMÁRIA | EXCLUSIVO | NÃO NULO |
REFERÊNCIAS foreigntable [(foreignfield1, foreignfield2)]
[ON UPDATE CASCADE | DEFINIR NULO]
[AO ELIMINAR CASCATA | DEFINIR NULO]}
Restrição de múltiplos campos:
Nome da restrição
{CHAVE PRIMÁRIA (primária1[, primária2 [, ...]]) |
EXCLUSIVO (exclusivo1[, exclusivo2 [, ...]]) |
NOT NULL (notnull1[, notnull2 [, ...]]) |
CHAVE EXTERNA [SEM ÍNDICE] (ref1[, ref2 [, ...]]) REFERÊNCIAS foreigntable [(foreignfield1 [, foreignfield2 [, ...]])]
[ON UPDATE CASCADE | DEFINIR NULO]
[AO ELIMINAR CASCATA | DEFINIR NULO]}
A cláusula CONSTRAINT tem as seguintes partes:
| Parte | Descrição |
|---|---|
| nome | O nome da restrição a criar. |
| primary1, primary2 | O nome do campo ou campos a designar como chave primária. |
| exclusivo1, exclusivo2 | O nome do campo ou campos a designar como uma chave exclusiva. |
| notnull1, notnull2 | O nome do campo ou campos restritos a valores não Nulos. |
| ref1, ref2 | O nome de um campo ou campos de chave externa que fazem referência a campos noutra tabela. |
| externa | O nome da tabela externa que contém o campo ou campos especificados por foreignfield. |
| campo externo1, campo estrangeiro2 | O nome do campo ou campos numa tabela externa especificada por ref1, ref2. Pode omitir esta cláusula se o campo referenciado for a chave primária da tabela externa. |
Comentários
Utilize a sintaxe para uma restrição de campo único na cláusula de definição de campo de uma instrução ALTER TABLE ou CREATE TABLE imediatamente a seguir à especificação do tipo de dados do campo.
Utilize a sintaxe para uma restrição de múltiplos campos sempre que utilizar a palavra reservada CONSTRAINT fora de uma cláusula de definição de campo numa instrução ALTER TABLE ou CREATE TABLE.
Ao utilizar CONSTRAINT, pode designar um campo como um dos seguintes tipos de restrições:
Pode utilizar a palavra reservada UNIQUE para designar um campo como uma chave exclusiva. Isto significa que nenhum registo na tabela pode ter o mesmo valor neste campo. Pode restringir qualquer campo ou lista de campos como exclusivos. Se uma restrição de múltiplos campos for designada como uma chave exclusiva, os valores combinados de todos os campos no índice têm de ser exclusivos, mesmo que dois ou mais registos tenham o mesmo valor em apenas um dos campos.
Pode utilizar as palavras reservadas DA CHAVE PRIMÁRIA para designar um campo ou conjunto de campos numa tabela como uma chave primária. Todos os valores na chave primária têm de ser exclusivos e não Nulos e só pode existir uma chave primária para uma tabela.
Observação
Não defina uma restrição DE CHAVE PRIMÁRIA numa tabela que já tenha uma chave primária; Se o fizer, ocorrerá um erro.
Pode utilizar as palavras reservadas CHAVE EXTERNA para designar um campo como chave externa. Se a chave primária da tabela externa for constituída por mais do que um campo, tem de utilizar uma definição de restrição de múltiplos campos, listando todos os campos de referência, o nome da tabela externa e os nomes dos campos referenciados na tabela externa pela mesma ordem em que os campos de referência estão listados. Se o campo ou campos referenciados forem a chave primária da tabela externa, não tem de especificar os campos referenciados. Por predefinição, o motor de base de dados comporta-se como se a chave primária da tabela externa fosse os campos referenciados.
As restrições de chave externa definem ações específicas a serem executadas quando um valor de chave primária correspondente é alterado:Pode especificar ações a executar na tabela externa com base numa ação correspondente executada numa chave primária na tabela na qual a RESTRIÇÃO está definida. Por exemplo, considere a seguinte definição para a tabela Clientes:
CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))
Considere a seguinte definição da tabela Encomendas, que define uma relação de chave externa que referencia a chave primária da tabela Clientes:
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE CASCADE ON DELETE CASCADE
Ambas as cláusulas ON UPDATE CASCADE e ON DELETE CASCADE são definidas na chave externa. A cláusula ON UPDATE CASCADE significa que, se o identificador de um cliente (CustId) for atualizado na tabela Cliente, a atualização será propagada através da tabela Encomendas. Cada encomenda que contenha um valor de identificador de cliente correspondente será atualizada automaticamente com o novo valor. A cláusula ON DELETE CASCADE significa que, se um cliente for eliminado da tabela Cliente, todas as linhas na tabela Encomendas que contenham o mesmo valor de identificador de cliente também serão eliminadas.
Considere a seguinte definição diferente da tabela Encomendas, utilizando a ação DEFINIR NULO em vez da ação CASCADE:
CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE SET NULL ON DELETE SET NULL
A cláusula ON UPDATE SET NULL significa que, se o identificador de um cliente (CustId) for atualizado na tabela Cliente, os valores de chave externa correspondentes na tabela Encomendas serão automaticamente definidos como NULL. Da mesma forma, a cláusula ON DELETE SET NULL significa que, se um cliente for eliminado da tabela Cliente, todas as chaves externas correspondentes na tabela Encomendas serão automaticamente definidas como NULL.
Para impedir a criação automática de índices para chaves externas, o modificador NO INDEX pode ser utilizado. Esta forma de definição de chave externa deve ser utilizada apenas nos casos em que os valores de índice resultantes seriam frequentemente duplicados. Quando os valores num índice de chave externa são frequentemente duplicados, a utilização de um índice pode ser menos eficiente do que simplesmente efetuar uma análise de tabela. Manter este tipo de índice, com linhas inseridas e eliminadas da tabela, degrada o desempenho e não proporciona qualquer benefício.