Instru????o ALTER TABLE

A instru????o ALTER TABLE permite:
  • adicionar coluna ?? tabela
  • adicionar restri????o ?? tabela
  • remover da tabela uma restri????o existente
  • aumentar o comprimento de coluna VARCHAR, CHAR VARYING e CHARACTER VARYING
  • sobrepor o bloqueio no n??vel de linha para a tabela (ou remover a sobreposi????o)

Sintaxe

ALTER TABLE nome-da-tabela
{
    ADD COLUMN defini????o-da-coluna |
    ADD CONSTRAINT cl??usula |
    DROP { PRIMARY KEY | FOREIGN KEY nome-da-restri????o | UNIQUE  nome-da-restri????o |
           CHECK nome-da-restri????o | CONSTRAINT nome-da-restri????o }
    ALTER altera????o-da-coluna |
    LOCKSIZE { ROW | TABLE }
}

defini????o-da-coluna

nome-de-coluna-simples tipo-de-dado
[ restri????o no n??vel-de-coluna ]*
[ [ WITH ] DEFAULT {Express??oConstante | NULL } ]

altera????o-da-coluna

nome-da-coluna SET DATA TYPE VARCHAR(inteiro) |
nome-da-coluna SET INCREMENT BY constante-inteira

Na altera????o-da-coluna, SET INCREMENT BY constante-inteira especifica o intervalo entre valores consecutivos da coluna de identidade. O pr??ximo valor a ser gerado para a coluna de identidade ser?? determinado a partir do ??ltimo valor atribu??do e o incremento a ser aplicado. A coluna deve ter sido definida com o atributo IDENTITY.

ALTER TABLE n??o afeta nenhuma vis??o que faz refer??ncia ?? tabela sendo alterada. Isto inclui as vis??es que possuem "*" na lista do SELECT. Estas vis??es devem ser removidas e recriadas para que retornem a nova coluna.

Adi????o de colunas

A sintaxe para a defini????o-da-coluna de uma nova coluna ?? a mesma que para a coluna na instru????o CREATE TABLE. Isto significa que pode ser colocada uma restri????o de coluna para a nova coluna na instru????o ALTER TABLE ADD COLUMN. Entretanto, somente pode ser adicionada uma coluna com a restri????o NOT NULL a uma tabela existente se for fornecido um valor padr??o; caso contr??rio, ?? lan??ada uma exce????o ao ser executada a instru????o ALTER TABLE.

Assim como em CREATE TABLE, se a defini????o da coluna incluir uma restri????o de unicidade ou de chave prim??ria, a coluna n??o poder?? conter valores nulos e, portanto, tamb??m deve ser especificado o atributo NOT NULL (SQLState 42831).

Nota: Se a tabela possuir um gatilho de UPDATE sem uma lista de colunas expl??cita, adicionar uma coluna ?? tabela adicionar?? esta coluna ?? lista de colunas de atualiza????o impl??cita sobre a qual o gatilho est?? definido, e todas as refer??ncias a vari??veis de transi????o ser??o invalidadas para que incluam a nova coluna.

Adi????o de restri????es

ALTER TABLE ADD CONSTRAINT adiciona restri????o no n??vel-de-tabela a uma tabela existente. Pode ser adicionado atrav??s de ALTER TABLE qualquer tipo de restri????o no n??vel-de-tabela suportado. Existem as seguintes limita????es para adicionar restri????o a uma tabela existente:
  • Ao adicionar uma restri????o de chave estrangeira ou de verifica????o a uma tabela existente, o Derby verifica a tabela para ter certeza que as linhas existentes satisfazem a restri????o. Se alguma linha for inv??lida, o Derby lan??ar?? uma exce????o de instru????o, e a restri????o n??o ser?? adicionada.
  • Todas as colunas inclu??das na chave prim??ria devem conter dados n??o nulos e serem ??nicas.

    ALTER TABLE ADD UNIQUE e PRIMARY KEY disp??em de um m??todo resumido para definir uma chave prim??ria formada por uma ??nica coluna. Se for especificado PRIMARY KEY na defini????o da coluna C, o efeito ser?? o mesmo de especificar a cl??usula PRIMARY KEY(C) como uma cl??usula em separado. A coluna n??o pode conter valores nulos, portanto o atributo NOT NULL tamb??m deve ser especificado.

Para obter informa????es sobre a sintaxe das restri????es deve ser consultada a Cl??usula CONSTRAINT. Ao se adicionar restri????es com a sintaxe ALTER TABLE ADD CONSTRAINT, deve ser utilizada a sintaxe para restri????o no n??vel-de-tabela.

Remo????o de restri????es

ALTER TABLE DROP CONSTRAINT remove uma restri????o de uma tabela existente. Para remover uma restri????o sem nome, deve ser especificado o nome gerado para a restri????o armazenado em SYS.SYSCONSTRAINTS na forma de um identificador delimitado.

A remo????o da restri????o de chave prim??ria, de unicidade ou de chave estrangeira remove o ??ndice f??sico que imp??e a restri????o (tamb??m conhecido por ??ndice de apoio).

Modifica????o de colunas

A altera????o-da-coluna permite alterar a coluna especificada das seguintes maneiras:
  • Aumentar o comprimento de uma coluna VARCHAR existente. Pode ser utilizado CHARACTER VARYING ou CHAR VARYING como sin??nimo para a palavra chave VARCHAR.

    Para aumentar o comprimento de uma coluna deste tipo, deve ser especificado o tipo de dado e o novo tamanho ap??s o nome da coluna.

    N??o ?? permitido diminuir o tamanho ou mudar o tipo de dado. N??o ?? permitido aumentar o comprimento de uma coluna que faz parte de uma chave prim??ria ou chave de unicidade referenciada por uma restri????o de chave estrangeira, ou que seja parte de uma restri????o de chave estrangeira.

  • Especifica????o do intervalo entre valores consecutivos da coluna de identidade.

    Para definir o intervalo entre valores consecutivos da coluna de identidade deve ser especificada uma constante-inteira. A coluna deve ter sido definida anteriormente com o atributo IDENTITY (SQLState 42837). Caso existam linhas na tabela, os valores na coluna para a qual o padr??o para SET INCREMENT foi adicionado n??o mudam.

Defini????o de padr??o

Pode ser especificado um valor padr??o para a nova coluna. O valor padr??o ?? o valor inserido na coluna se n??o for especificado nenhum outro valor. Quando n??o ?? especificado explicitamente, o valor padr??o da coluna ?? NULL. Se for especificado valor padr??o para uma nova coluna, as linhas existentes na tabela receber??o o valor padr??o na nova coluna.

Para obter mais informa????es sobre valor padr??o deve ser consultada a Instru????o CREATE TABLE.

Altera????o da granularidade do bloqueio da tabela

A cl??usula LOCKSIZE permite sobrepor o bloqueio no n??vel-de-linha para uma determinada tabela, se o sistema utilizar a defini????o padr??o de bloqueio no n??vel-de-linha (Se o sistema estiver definido com bloqueio no n??vel-de-tabela, n??o ser?? poss??vel alterar a granularidade do bloqueio, embora o Derby permita utilizar a cl??usula LOCKSIZE nesta situa????o sem lan??ar uma exce????o). Para sobrepor o bloqueio no n??vel-de-linha de uma determinada tabela, deve ser definido o bloqueio da tabela como TABLE. Se a tabela tiver sido criada com a granularidade de bloqueio no n??vel-de-tabela, o bloqueio poder?? passar a ser no n??vel-de-linha especificando ROW na cl??usula LOCKSIZE da instru????o ALTER TABLE. Para obter informa????es sobre porque algumas vezes esta altera????o ?? ??til, deve ser consultado o Ajuste do Derby.

Exemplos

-- Adicionar uma nova coluna com restri????o no
-- n??vel-de-coluna a uma tabela existente.
-- Se a tabela tiver alguma linha ser?? lan??ada uma exce????o,
-- uma vez que a nova coluna ser?? inicializada com NULL
-- em todas as linhas da tabela.

ALTER TABLE CIDADES ADD COLUMN REGI??O VARCHAR(26)
CONSTRAINT NOVA_RESTRI????O CHECK (REGI??O IS NOT NULL);

-- Adicionar uma restri????o de unicidade a uma tabela existente.
-- Ser?? lan??ada uma exce????o se forem encontradas chaves duplicadas.

ALTER TABLE SAMP.DEPARTAMENTOS
ADD CONSTRAINT NOVA_UNICIDADE UNIQUE (NUM_DEP);

-- Adicionar uma restri????o de chave estrangeira ??
-- tabela cidades. Cada linha de cidades ?? verificada
-- para ter certeza que satisfaz a restri????o.
-- Se alguma linha n??o satisfizer a restri????o, a
-- restri????o n??o ser?? adicionada

ALTER TABLE CIDADES ADD CONSTRAINT FK_PA??SES
FOREIGN KEY (PA??S) REFERENCES PA??SES (PA??S);

-- Adicionar uma restri????o de chave prim??ria ?? tabela.
-- Primeiro, criar a tabela.
CREATE TABLE ATIVIDADES (ID_CIDADE INT NOT NULL,
ESTA????O CHAR(2), ATIVIDADE VARCHAR(32) NOT NULL);

-- N??o ser?? poss??vel adicionar esta restri????o se as
-- colunas que comp??em a chave prim??ria possu??rem
-- dados nulos ou valores duplicados.
ALTER TABLE ATIVIDADES ADD PRIMARY KEY (ID_CIDADE, ATIVIDADE);

-- Remover a restri????o de chave prim??ria da tabela cidades.
ALTER TABLE CIDADES DROP CONSTRAINT PK_CIDADES;

-- Remover a restri????o de chave estrangeira da tabela cidades.
ALTER TABLE CIDADES DROP CONSTRAINT FK_PA??SES;

-- Adicionar a coluna NUM_DEP com valor padr??o igual a 1.
ALTER TABLE SAMP.ATIV_EMP ADD COLUMN NUM_DEP INT DEFAULT 1;

-- Aumentar o comprimento da coluna VARCHAR.
ALTER TABLE SAMP.EMP_FOTO ALTER FORMATO_FOTO SET DATA TYPE VARCHAR(30);

-- Alterar a granularidade do bloqueio da tabela.
ALTER TABLE SAMP.VENDAS LOCKSIZE TABLE;

Resultados

A instru????o ALTER TABLE faz com que todas as instru????es que dependem da tabela sendo alterada sejam recompiladas antes de sua pr??xima execu????o. A instru????o ALTER TABLE n??o ?? permitida caso existam cursores abertos fazendo refer??ncia ?? tabela sendo alterada.

Conceitos relacionados
Intera????o com o sistema de depend??ncias
Instru????es CREATE
Instru????es DROP
Instru????es RENAME
Instru????es SET
Refer??ncias relacionadas
CALL (PROCEDIMENTO)
Cl??usula CONSTRAINT
Instru????o DECLARE GLOBAL TEMPORARY TABLE
Instru????o DELETE
Cl??usula FOR UPDATE
Cl??usula FROM
Cl??usula GROUP BY
Cl??usula HAVING
INNER JOIN
Instru????o INSERT
Opera????o JOIN
LEFT OUTER JOIN
Instru????o LOCK TABLE
Cl??usula ORDER BY
Consulta
RIGHT OUTER JOIN
SubconsultaEscalar
Express??oSele????o
Instru????o SELECT
Express??oTabela
SubconsultaTabela
Instru????o UPDATE
VALUES Express??o
Cl??usula WHERE
Cl??usula WHERE CURRENT OF