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 }
Onde:
inlineUniquePK ::= [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY } [ [ NOT ] ENFORCED ] [ [ NOT ] DEFERRABLE ] [ INITIALLY { DEFERRED | IMMEDIATE } ] [ { ENABLE | DISABLE } ] [ { VALIDATE | NOVALIDATE } ] [ { RELY | NORELY } ]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 } ]
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 }
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 } ]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 } ]
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 }
{ VALIDATE | NOVALIDATE }
só se aplica quando é especificado{ ENFORCED | NOT ENFORCED }
ou{ ENABLE | DISABLE }
.{ RELY | NORELY }
só se aplica quandoNOVALIDATE
é especificado.Padrões:
NOT ENFORCED
DEFERRABLE
INITIALLY DEFERRED
DISABLE
NOVALIDATE
NORELY
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 } ]
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) ...
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 );Alterar a tabela para adicionar uma coluna com uma restrição:
ALTER TABLE table1 ADD COLUMN col2 VARCHAR NOT NULL;
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;
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 );