Cláusula CONSTRAINT Cláusula CONSTRAINT Restrições Propriedades de armazenamentopara índices apoiando restrições Apoio a índicesespecificação de propriedades de armazenamento Tabelasespecificação do tamanho da páginaespecificação das propriedades

A cláusula CONSTRAINT é uma parte opcional da Instrução CREATE TABLE e da Instrução ALTER TABLE. A restrição é uma regra com a qual os dados devem estar em conformidade. O nome da restrição é opcional.

A restrição pode ser:

  • Restrição no nível-de-coluna Restriçãonível-de-coluna restrição no nível-de-coluna

    As restrições no nível-de-coluna fazem referência a uma única coluna da tabela, e não especificam o nome da coluna (exceto as restrições de verificação). Se referem à coluna a qual seguem.

  • Restrição no nível-de-tabela Restriçãonível-de-tabela restrição no nível-de-tabela

    As restrições no nível-de-tabela fazem referência a uma ou mais colunas da tabela. As restrições no nível-de-tabela especificam os nomes das colunas às quais se aplicam. As restrições de verificação (CHECK) no nível de tabela podem fazer referência a zero ou mais colunas da tabela.

Restrições no nível-de-colunautilizadas nas instruções CREATE TABLE Restriçõesnível-de-coluna As restrições de coluna incluem:

  • NOT NULL

    Especifica que a coluna não pode conter valores nulos (não pode ser dado nome a restrições deste tipo).

  • PRIMARY KEY Chaves primáriascriaçãoadição

    Especifica a coluna que identifica unicamente uma linha da tabela. A coluna identificada deve ser definida como NOT NULL.

    Se for tentado adicionar uma chave primária utilizando a instrução ALTER TABLE, e alguma coluna incluída na chave primária contiver valores nulos, será gerado um erro e a chave primária não será adicionada. Para obter mais informações deve ser consultada a Instrução ALTER TABLE.
  • UNIQUE

    Especifica que os valores na coluna devem ser únicos. Não são permitidos valores nulos.

  • FOREIGN KEY

    Especifica que os valores na coluna devem corresponder a valores em uma coluna de chave primária ou de chave única referenciada, ou que são nulos.

  • CHECK

    Especifica regras para os valores da coluna.

Restrições de tabelautilizadas na instrução CREATE TABLE Restriçõesnível-de-tabela As restrições de tabela incluem:

  • PRIMARY KEY Chaves primáriascriaçãoadição

    Especifica a coluna ou colunas que identificam unicamente uma linha da tabela. Não são permitidos valores nulos.

  • UNIQUE

    Especifica que os valores nas colunas devem ser únicos. As colunas identificadas devem ser definidas como NOT NULL.

  • FOREIGN KEY

    Especifica que os valores nas colunas devem corresponder a valores em colunas de uma chave primária ou chave única referenciada, ou que são nulos.

    Se a chave estrangeira for formada por várias colunas, e se alguma coluna for nula, toda a chave será considerada nula. A inserção será permitida não importando o que esteja presente nas colunas não-nulas.
  • CHECK

    Especifica diversas regras para os valores na tabela.

Restriçõesdiferenças entre nível-de-coluna e nível-de-tabela As restrições de coluna e restrições de tabela possuem a mesma função; a diferença é onde são especificadas. As restrições de tabela permitem especificar mais de uma coluna na definição da restrição PRIMARY KEY, UNIQUE, CHECK e FOREIGN KEY. As restrições no nível-de-coluna (exceto as restrições de verificação) fazem referência a apenas uma coluna.

Sintaxe
Restrições de chave primária e de unicidade

Restrições de chave primária Restrições de unicidade A chave primária define o conjunto de colunas que identificam unicamente as linhas da tabela.

Quando se cria uma restrição de chave primária, nenhuma das colunas incluídas na chave primária pode ter a restrição NULL; ou seja, não podem permitir valores nulos.

A instrução ALTER TABLE ADD PRIMARY KEY permite incluir colunas existentes em uma chave primária, caso estas tenham sido anteriormente definidas como NOT NULL. Os valores NULL não são permitidos. Se as colunas contiverem valores nulos, o sistema não adicionará a restrição de chave primária. Para obter mais informações deve ser consultada a Instrução ALTER TABLE.

A tabela pode ter no máximo uma restrição PRIMARY KEY, mas pode ter várias restrições UNIQUE.

Restrições de chave estrangeira

Chaves estrangeiras Integridade referencialatravés de chaves estrangeiras As chaves estrangeiras fornecem um meio de impor a integridade referencial de um banco de dados. A chave estrangeira é uma coluna, ou grupo de colunas, dentro da tabela que fazem referência a uma chave de alguma outra tabela (ou algumas vezes, embora raramente, à mesma tabela). A chave estrangeira deve incluir sempre colunas cujos tipos correspondem exatamente aos tipos das colunas da restrição de chave primária ou de unicidade referenciada.

Em uma restrição de chave estrangeira no nível-de-tabela, para a qual são especificadas as colunas da tabela que compõem a restrição, a mesma coluna não pode ser usada mais de uma vez.

Se houver uma lista de colunas na EspecificaçãoReferencias (lista das colunas na tabela referenciada), esta lista deverá corresponder a uma restrição de chave primária ou a uma restrição de unicidade da tabela referenciada. A EspecificaçãoReferencias pode omitir a lista de colunas da tabela referenciada, se esta tabela possuir uma chave primária declarada.

Se não houver uma lista de colunas na EspecificaçãoReferencias, e a tabela referenciada não possuir uma chave primária, será lançada uma exceção de instrução (Isto significa que se a tabela referenciada possuir apenas chaves únicas, é necessário incluir a lista de colunas na EspecificaçãoReferencias).

A restrição de chave estrangeira está satisfeita quando há um valor correspondente na coluna de unicidade ou de chave primária correspondente. Se a chave estrangeira for composta por várias colunas, o valor da chave estrangeira será considerado nulo quando qualquer uma de suas colunas tiver o valor nulo. É possível que uma chave estrangeira formada por várias colunas permita que uma de suas colunas contenha um valor para o qual não exista valor correspondente nas colunas referenciadas, de acordo com o padrão SQL-92. Para evitar esta situação, devem ser criadas restrições NOT NULL em todas as colunas da chave estrangeira.

Restrições de chave estrangeira e a DML

Quando é feita uma inserção ou atualização em uma tabela que possui uma restrição de chave estrangeira habilitada, o verifica se a linha não viola a restrição de chave estrangeira procurando a chave referenciada correspondente na tabela referenciada. Se a restrição não for satisfeita, o rejeitará a inserção ou a atualização através de uma exceção de instrução.

Quando uma linha de uma tabela com uma chave referenciada (uma restrição de chave primária ou de unicidade referenciada por uma chave estrangeira) é atualizada ou removida, o verifica todas as restrições de chave estrangeira que fazem referência à chave, para ter certeza que a remoção ou a modificação da linha não causa violação da restrição. Se a remoção ou a modificação da linha causar uma violação da restrição, a atualização ou remoção não será permitida, e o lançará uma exceção de instrução.

O realiza as verificações de restrição no momento em que a instrução é executada, e não quando a transação é efetivada.

Índices de apoio

Índices de apoiocriados automaticamente para impor as restrições de chave primária, unicidade e de chave estrangeira Índicescriação automática para as restrições de chave primária, unicidade e de chave estrangeira As restrições UNIQUE, PRIMARY KEY e FOREIGN KEY geram índices que impõem, ou "apoiam", à restrição (sendo algumas vezes chamados de índices de apoio). As restrições UNIQUE e PRIMARY KEY geram índices únicos. As restrições FOREIGN KEY geram índices que não são únicos. Portanto, se uma coluna, ou conjunto de colunas, estiverem envolvidas em uma restrição UNIQUE, PRIMARY KEY ou FOREIGN KEY, não é necessário criar índices nestas colunas para melhorar o desempenho, o já terá criado o índice. Consulte Índices e restrições.

Estes índices ficam disponíveis para o otimizador para a otimização de comandos (consulte a Instrução CREATE INDEX), e possuem nomes gerados pelo sistema.

Não é permitido remover um índice de apoio através da instrução DROP INDEX; é necessário remover a restrição ou a tabela.

Restrições de verificação

Restrições de verificação As restrições de verificação podem ser utilizadas para especificar diversas regras para o conteúdo da tabela. É especificada uma condição de procura (que é uma expressão booleana), para a restrição de verificação. Esta condição de procura deve ser satisfeita por todas as linhas da tabela. A condição de procura é aplicada a toda linha modificada por uma instrução INSERT ou UPDATE, na hora em que a linha é modificada. A instrução é interrompida por completo quando qualquer restrição de verificação é violada.

Requisitos da condição de procura

Se a restrição de verificação for especificada como parte da definição-da-coluna, a referência a coluna somente poderá ser feita para a mesma coluna. As restrições de verificação especificadas como parte da definição da tabela, podem possuir referência a colunas que identificam colunas definidas anteriormente na instrução CREATE TABLE.

A condição de procura deve retornar sempre o mesmo valor quando for aplicada aos mesmos valores. Portanto, não pode conter:

  • Parâmetros dinâmicos (?)
  • Funções de Data/Hora (CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP)
  • Subconsultas
  • Funções de usuário (tal como USER, SESSION_USER, CURRENT_USER)

Ações referenciais

Ações referenciais Cláusula de restriçãoações referenciais Quando a chave estrangeira é definida, pode ser especificada uma cláusula ON DELETE e/ou ON UPDATE seguida pela ação apropriada (CASCADE, RESTRICT, SET NULL ou NO ACTION). Estas cláusulas especificam se o deve modificar os valores da chave estrangeira correspondente ou não permitir a operação, para manter o relacionamento de chave estrangeira intacto quando o valor da chave primária for atualizado ou excluído da tabela.

A regra de atualização ou de exclusão da restrição referencial é especificada quando a restrição referencial é definida.

A regra de atualização é aplicada quando uma linha da tabela mãe ou da tabela dependente é atualizada. As escolhas são NO ACTION e RESTRICT.

Quando se atualiza o valor de uma coluna da chave primária da tabela mãe, e a regra de atualização está especificada como RESTRICT, o verifica as tabelas dependentes com relação às restrições de chave estrangeira. Se alguma linha de tabela dependente violar a restrição de chave estrangeira, a transação será desfeita.

Se a regra de atualização for NO ACTION, o verificará as tabelas dependentes com relação às restrições de chave estrangeira após todas as exclusões terem sido executadas, mas antes dos gatilhos serem executados. Se alguma linha de tabela dependente violar a restrição de chave estrangeira, a instrução será rejeitada.

Quando é atualizado o valor de uma coluna em uma tabela dependente, e este valor faz parte da chave estrangeira, a regra de atualização implícita é NO ACTION. NO ACTION significa que se a chave estrangeira for atualizada com um valor não-nulo, o valor atualizado deverá corresponder a um valor na chave primária da tabela mãe quando a instrução estiver completa. Se a atualização não corresponder a um valor na chave primária da tabela mãe, a instrução será rejeitada.

A regra de exclusão é aplicada quando uma linha da tabela mãe é excluída, e esta linha possui dependentes na tabela dependente da restrição referencial. Quando são excluídas linhas da tabela dependente, a operação de exclusão da tabela mãe é dita como propagada para a tabela dependente. Se a tabela dependente também for uma tabela mãe, a ação especificada será aplicada, por sua vez, às suas tabelas dependentes.

As escolhas são NO ACTION, RESTRICT, CASCADE e SET NULL. SET NULL somente poderá ser especificada quando alguma coluna da chave estrangeira permitir valores nulos.

Se a regra de exclusão for:

NO ACTION, o verificará as tabelas dependentes com relação às restrições referenciais após todas as exclusões terem sido executadas, mas antes dos gatilhos serem executados. Se alguma linha da tabela dependente violar a restrição de chave estrangeira, a instrução será rejeitada.

RESTRICT, o verificará as tabelas dependentes com relação às chaves estrangeiras. Se alguma linha da tabela dependente violar a restrição de chave estrangeira, a transação será desfeita.

CASCADE, a operação de exclusão será propagada para a tabela dependente (e para as dependentes desta tabela, caso se aplique).

SET NULL, todas as colunas da chave estrangeira da tabela dependente que aceitam o valor nulo, receberão o valor nulo (Novamente, se a tabela dependente também possuir tabelas dependentes, as colunas das chaves estrangeiras destas tabelas que aceitam o valor nulo, receberão o valor nulo)

Cada restrição referencial onde a tabela é a tabela mãe, possui suas próprias regras de exclusão; todas as regras de exclusão aplicáveis são utilizadas para determinar o resultado da operação de exclusão. Portanto, não poderá ser excluída uma linha que possua dependentes em uma restrição referencial com regra de exclusão RESTRICT ou NO ACTION. De forma semelhante, a linha não poderá ser excluída quando a exclusão se propagar em cascata para alguma de suas descendentes que seja dependente em uma restrição referencial com a regra de exclusão RESTRICT ou NO ACTION.

A exclusão de uma linha da tabela mãe envolve outras tabelas. Qualquer tabela envolvida em uma operação de exclusão na tabela mãe é dita como sendo conectada-para-exclusão com a tabela mãe. A exclusão pode afetar as linhas destas tabelas das seguintes maneiras:

  • Se a regra de exclusão for RESTRICT ou NO ACTION, a tabela dependente estará envolvida na operação, mas não será afetada pela operação (ou seja, o verificará os valores na tabela, mas não excluirá qualquer valor).
  • Se a regra de exclusão for SET NULL, as linhas da tabela dependente poderão ser atualizadas quando uma linha da tabela mãe for objeto de uma exclusão ou de uma operação de exclusão propagada.
  • Se a regra de exclusão for CASCADE, as linhas da tabela dependente poderão ser excluídas quando a tabela mãe for objeto de uma exclusão.
  • Se a tabela dependente também for uma tabela mãe, as ações descritas nesta lista serão aplicadas, por sua vez, às suas tabelas dependentes.

Exemplos -- restrição de chave primária no nível-de-coluna chamada PK_SAÍDA: CREATE TABLE SAMP.CAIXA_SAÍDA ( ENVIO TIMESTAMP, DESTINO CHAR(8), ASSUNTO CHAR(64) NOT NULL CONSTRAINT PK_CAIXA_SAÍDA PRIMARY KEY, TEXTO_NOTA VARCHAR(3000) ); -- a definição de chave primária no nível-de-tabela permite -- incluir duas colunas na definição da chave primária: CREATE TABLE SAMP.AGENDA ( COD_CLASSE CHAR(7) NOT NULL, DIA SMALLINT NOT NULL, INÍCIO TIME, FIM TIME, PRIMARY KEY (COD_CLASSE, DIA) ); -- Uso de uma restrição no nível-de-coluna para verificação aritmética. -- Uso de uma restrição no nível-de-tabela para ter certeza que os -- impostos do empregado não são maiores que os bônus. CREATE TABLE SAMP.EMP ( NUM_EMP CHAR(6) NOT NULL CONSTRAINT PK_EMP PRIMARY KEY, NOME CHAR(12) NOT NULL, INICIAL_MEIO VARCHAR(12) NOT NULL, SOBRENOME VARCHAR(15) NOT NULL, SALÁRIO DECIMAL(9,2) CONSTRAINT VERIF_SAL CHECK (SALÁRIO >= 10000), BÔNUS DECIMAL(9,2), IMPOSTOS DECIMAL(9,2), CONSTRAINT VERIF_BÔNUS CHECK (BÔNUS > IMPOSTOS) ); -- Uso de uma restrição de verificação para permitir -- apenas as abreviaturas apropriadas para as refeições CREATE TABLE VÔOS ( ID_VÔO CHAR(6) NOT NULL , NÚMERO_SEGMENTO INTEGER NOT NULL , AEROPORTO_ORIGEM CHAR(3), HORA_PARTIDA TIME, AEROPORTO_DESTINO CHAR(3), HORA_CHEGADA TIME, REFEIÇÃO CHAR(1) CONSTRAINT VERIF_REFEIÇÃO CHECK (REFEIÇÃO IN ('B', 'L', 'D', 'S')), PRIMARY KEY (ID_VÔO, NÚMERO_SEGMENTO) ); CREATE TABLE METROPOLITANO ( ID_HOTEL INT NOT NULL CONSTRAINT PK_HOTÉIS PRIMARY KEY, NOME_HOTEL VARCHAR(40) NOT NULL, ID_CIDADE INT CONSTRAINT FK_METRO REFERENCES CIDADES ); -- criação de uma tabela com uma restrição de chave primária -- e uma restrição de chave estrangeira no nível-de-tabela CREATE TABLE VÔOS_DISP ( ID_VÔO CHAR(6) NOT NULL, NÚMERO_SEGMENTO INT NOT NULL, DATA_VÔO DATE NOT NULL, ASSENTOS_ECONÔMICOS_OCUPADOS INT, ASSENTOS_EXECUTIVOS_OCUPADOS INT, ASSENTOS_PRIMEIRA_CLASSE_OCUPADOS INT, CONSTRAINT PK_VÔOS_DISP PRIMARY KEY (ID_VÔO, NÚMERO_SEGMENTO), CONSTRAINT FK_VÔOS FOREIGN KEY (ID_VÔO, NÚMERO_SEGMENTO) REFERENCES VÔOS (ID_VÔO, NÚMERO_SEGMENTO) ); -- adicionar uma restrição de unicidade a uma coluna ALTER TABLE SAMP.PROJETO ADD CONSTRAINT UNQ_PROJ UNIQUE (NOME_PROJ); -- criar uma tabela cuja coluna ID_CIDADE faça referência -- à chave primária da tabela CIDADES utilizando uma -- restrição de chave estrangeira no nível-de-coluna CREATE TABLE CONDOMÍNIOS ( ID_COND INT NOT NULL CONSTRAINT PK_HOTÉIS PRIMARY KEY, NOME_COND VARCHAR(40) NOT NULL, ID_CIDADE INT CONSTRAINT FK_CIDADE REFERENCES CIDADES ON DELETE CASCADE ON UPDATE RESTRICT );
Sistema de dependência de instrução

As instruções INSERT e UPDATE dependem de todas as restrições da tabela de destino. As instruções DELETE dependem das restrições de unicidade, chave primária e de chave estrangeira. Estas instruções são invalidadas quando é adicionada ou removida uma restrição na tabela de destino.