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.
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.
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.
Especifica que a coluna n??o pode conter valores nulos (n??o pode ser dado nome a restri????es deste tipo).
Especifica a coluna que identifica unicamente uma linha da tabela. A coluna identificada deve ser definida como NOT NULL.
Especifica que os valores na coluna devem ser ??nicos. N??o s??o permitidos valores nulos.
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.
Especifica regras para os valores da coluna.
Especifica a coluna ou colunas que identificam unicamente uma linha da tabela. N??o s??o permitidos valores nulos.
Especifica que os valores nas colunas devem ser ??nicos. As colunas identificadas devem ser definidas como NOT NULL.
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.
Especifica diversas regras para os valores na 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.
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.
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).
Quando ?? feita uma inser????o ou atualiza????o em uma tabela que possui uma restri????o de chave estrangeira habilitada, o Derby 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 Derby 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 Derby 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 Derby lan??ar?? uma exce????o de instru????o.
O Derby realiza as verifica????es de restri????o no momento em que a instru????o ?? executada, e n??o quando a transa????o ?? efetivada.
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 Derby 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.
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.
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.
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 Derby 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 Derby 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 Derby 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 Derby 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 Derby 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.
-- 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
);
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.