CREATE | ALTER TABLE … CONSTRAINT

Este tópico descreve como criar restrições especificando uma cláusula CONSTRAINT em uma instrução CREATE TABLE ou ALTER TABLE:

  • Uma restrição em linha é especificada como parte da definição da coluna individual.

  • Uma restrição fora de linha é especificada como uma cláusula independente:

    • Ao criar uma tabela, a cláusula faz parte das definições da coluna para a tabela.

    • Ao alterar uma tabela, a cláusula é especificada como uma ação ADD explícita para a tabela.

Para obter mais informações, incluindo exemplos detalhados, consulte Restrições.

Sintaxe

Chave em linha única / primária / estrangeira

CREATE TABLE <name> ( <col1_name> <col1_type>    [ NOT NULL ] { inlineUniquePK | inlineFK }
                     [ , <col2_name> <col2_type> [ NOT NULL ] { inlineUniquePK | inlineFK } ]
                     [ , ... ] )

ALTER TABLE <name> ADD COLUMN <col_name> <col_type> [ NOT NULL ] { inlineUniquePK | inlineFK }
Copy

Onde:

inlineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY }
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]
Copy
inlineFK :=
  [ CONSTRAINT <constraint_name> ]
  [ FOREIGN KEY ]
  REFERENCES <ref_table_name> [ ( <ref_col_name> ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]
Copy

Chave fora de linha única / primária / estrangeira

CREATE TABLE <name> ... ( <col1_name> <col1_type>
                         [ , <col2_name> <col2_type> , ... ]
                         [ , { outoflineUniquePK | outoflineFK } ]
                         [ , { outoflineUniquePK | outoflineFK } ]
                         [ , ... ] )

ALTER TABLE <name> ... ADD { outoflineUniquePK | outoflineFK }
Copy

Onde:

outoflineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY } ( <col_name> [ , <col_name> , ... ] )
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]
Copy
outoflineFK :=
  [ CONSTRAINT <constraint_name> ]
  FOREIGN KEY ( <col_name> [ , <col_name> , ... ] )
  REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]
Copy

Propriedades de restrição

Para compatibilidade com outros bancos de dados, o Snowflake oferece propriedades de restrição. As propriedades que podem ser especificadas para uma restrição dependem do tipo:

  • Algumas propriedades se aplicam a todas as chaves (únicas, primárias e estrangeiras).

  • Outras propriedades se aplicam somente a chaves estrangeiras.

Importante

Essas propriedades são fornecidas para facilitar a migração de outros bancos de dados. Elas não são impostas ou mantidas pelo Snowflake. Isso significa que os padrões podem ser alterados para estas propriedades, mas alterar os padrões resulta no Snowflake não criando a restrição.

Para obter mais detalhes, consulte Propriedades de restrição.

Propriedades (para todas as chaves)

As seguintes propriedades de restrição se aplicam a todas as chaves (a ordem das propriedades é intercambiável):

[ NOT ] ENFORCED
[ NOT ] DEFERRABLE
INITIALLY { DEFERRED | IMMEDIATE }
ENABLE | DISABLE
VALIDATE | NOVALIDATE
RELY | NORELY
Copy
  • VALIDATE | NOVALIDATE só se aplica quando é especificado ENFORCED | NOT ENFORCED ou ENABLE | DISABLE.

  • RELY | NORELY só se aplica quando NOVALIDATE é especificado.

  • Padrões:

    NOT ENFORCED DEFERRABLE INITIALLY DEFERRED ENABLE NOVALIDATE RELY

Propriedades (somente para chaves estrangeiras)

As seguintes propriedades de restrição se aplicam somente a chaves estrangeiras (a ordem das propriedades é intercambiável):

MATCH { FULL | SIMPLE | PARTIAL }
ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
   [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
Copy
  • MATCH ... especifica se a restrição de chave estrangeira é satisfeita com relação aos valores NULL em uma ou mais das colunas.

  • ON ... especifica as ações executadas quando a chave primária de uma chave estrangeira é atualizada ou excluída.

  • Padrões:

    MATCH FULL UPDATE NO ACTION DELETE NO ACTION

Notas de uso

  • NOT NULL especifica que a coluna não permite valores NULL:

    • Esta é a única restrição imposta pelo Snowflake. Consulte Restrições de integridade referencial.

    • Ela pode ser especificada apenas como uma restrição em linha dentro da definição da coluna.

    • O padrão é permitir valores NULL em colunas.

  • Restrições multicolunas (por exemplo, chaves compostas únicas ou primárias) só podem ser definidas fora de linha.

  • Ao definir chaves estrangeiras, seja em linha ou fora de linha, o(s) nome(s) da(s) coluna(s) para a tabela referenciada não precisa(m) ser especificado(s) se a assinatura (isto é, nome e tipo de dados) da(s) coluna(s) de chave(s) estrangeira(s) e a(s) coluna(s) de chave(s) primária(s) da tabela referenciada coincidirem exatamente.

  • Se você criar uma chave estrangeira, as colunas da cláusula REFERENCES deverão ser listadas na mesma ordem em que as colunas foram listadas para a chave primária. Por exemplo:

    create table parent ... constraint primary_key_1 primary key (c_1, c_2) ...
    create table child  ... constraint foreign_key_1 foreign key (...) REFERENCES parent (c_1, c_2) ...
    
    Copy

    Em ambos os casos, a ordem das colunas é c_1, c_2. Se a ordem das colunas na chave estrangeira tivesse sido diferente (por exemplo, c_2, c_1), a tentativa de criar a chave estrangeira teria falhado.

Exemplos

O exemplo abaixo mostra como criar uma simples restrição NOT NULL ao criar uma tabela, e outra restrição NOT NULL ao alterar uma tabela:

Criar uma tabela e, ao mesmo tempo, criar uma restrição:

CREATE TABLE table1 (
    col1 INTEGER NOT NULL
    );
Copy

Alterar a tabela para adicionar uma coluna com uma restrição:

ALTER TABLE table1 
    ADD COLUMN col2 VARCHAR NOT NULL;
Copy

O exemplo a seguir especifica que a intenção da coluna é manter valores únicos, mas deixa claro que a restrição não é realmente aplicada. Este exemplo também demonstra como especificar um nome para a restrição (“uniq_col3”, neste caso).

ALTER TABLE table1 
    ADD COLUMN col3 VARCHAR NOT NULL CONSTRAINT uniq_col3 UNIQUE NOT ENFORCED;
Copy

O seguinte cria uma tabela pai com uma restrição de chave primária e outra tabela com uma restrição de chave estrangeira que aponta para as mesmas colunas da primeira restrição de chave primária da tabela.

CREATE TABLE table2 (
    col1 INTEGER NOT NULL,
    col2 INTEGER NOT NULL,
    CONSTRAINT pkey_1 PRIMARY KEY (col1, col2) NOT ENFORCED
    );
CREATE TABLE table3 (
    col_a INTEGER NOT NULL,
    col_b INTEGER NOT NULL,
    CONSTRAINT fkey_1 FOREIGN KEY (col_a, col_b) REFERENCES table2 (col1, col2) NOT ENFORCED
    );
Copy