# 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.

Tópico pai: Instruções
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