Visão geral das restrições

O Snowflake oferece a seguinte funcionalidade de restrição:

  • Tipos de restrições de ANSI SQL padrão. Para obter mais informações, consulte Tipos de restrições compatíveis.

  • Restrições nomeadas.

  • Restrições de coluna única e de várias colunas.

  • Criação de restrições em linha e fora de linha.

  • Criação, modificação e exclusão de restrições.

Para obter mais informações, consulte CREATE | ALTER TABLE … CONSTRAINT.

Tipos de restrições compatíveis

O Snowflake oferece suporte aos seguintes tipos de restrição da norma ANSI SQL:

  • PRIMARY KEY: Garante que todos os valores em uma coluna sejam distintos e que a coluna não possa armazenar valores NULL. A chave primária identifica cada linha em uma tabela de forma única.

  • UNIQUE: Garante que todos os valores em uma coluna sejam distintos. Diferente da restrição PRIMARYKEY, uma coluna com uma restrição UNIQUE pode ter valores NULL.

  • FOREIGN KEY: Impõe a integridade referencial exigindo valores em uma coluna ou conjunto de colunas para corresponder a valores em outra tabela ou na mesma tabela.

  • NOT NULL: Garante que uma coluna não possa armazenar um valor NULL.

  • CHECK: Impõe uma expressão SQL como condição para os valores que podem ser inseridos ou atualizados em uma ou mais colunas de uma tabela. Para obter mais informações, consulte Restrições CHECK.

Uma tabela pode ter várias chaves únicas e chaves estrangeiras, mas apenas uma chave primária. Uma restrição PRIMARY KEY implica que a coluna é NOT NULL e UNIQUE.

Todas as chaves estrangeiras devem fazer referência a uma chave primária ou única que corresponda aos tipos de coluna de cada coluna na chave estrangeira. A chave primária para uma chave estrangeira pode estar em uma tabela diferente ou na mesma tabela que a chave estrangeira. Ao definir restrições FOREIGNKEY em tabelas híbridas, as tabelas deverão estar no mesmo banco de dados.

A tabela a seguir resume as diferenças de comportamento entre tabelas padrão e tabelas híbridas, com relação à aplicação de restrições e se as restrições são necessárias:

  • Uma restrição é imposta quando protege uma coluna de ser atualizada de determinadas maneiras. Por exemplo, uma coluna declarada NOT NULL não pode ter um valor NULL. Uma tentativa de copiar ou inserir um valor NULL em uma coluna NOT NULL resulta em um erro. Para tabelas híbridas, não é possível definir a propriedade NOT ENFORCED nas restrições PRIMARY KEY, FOREIGN KEY e UNIQUE. A configuração dessa propriedade resulta em um erro invalid constraint property.

  • Uma restrição é obrigatória quando uma ou mais colunas em uma tabela devem ter tal restrição, o que é verdadeiro apenas para restrições PRIMARY KEY em tabelas híbridas.

Recurso

Tabelas híbridas

Tabelas padrão

Restrições PRIMARY KEY

Obrigatório, imposto

Opcional, não obrigatório

Restrições FOREIGN KEY

Opcionais e impostas (integridade referencial)

Opcional, não obrigatório

Restrições UNIQUE

Opcionais e impostas

Opcional, não obrigatório

Restrições NOT NULL

Opcionais e impostas

Opcionais e impostas

Restrições CHECK

Sem suporte

Opcionais e impostas

Restrições de tabela

O Snowflake oferece suporte a restrições em tabelas permanentes, transitórias, temporárias e híbridas. É possível definir restrições em colunas de todos os tipos de dados e pode incluir qualquer número de colunas em uma única restrição.

Considerações importantes sobre restrições:

  • Quando você copia uma tabela usando CREATE TABLE … LIKE ou CREATE TABLE … CLONE, todas as restrições atuais na tabela, incluindo chaves estrangeiras, são copiadas para a nova tabela. CREATE TABLE … CLONE não são compatíveis com tabelas híbridas.

  • Comandos e funções adicionais, como DROP, UNDROP e GET_DDL são aceitos em tabelas com restrições. Eles também são aceitos para esquemas e bancos de dados.

    Para o Snowflake Time Travel, quando versões anteriores de uma tabela são copiadas, a versão atual das restrições na tabela é usada porque o Snowflake não armazena versões anteriores de restrições nos metadados da tabela.

Restrições de coluna única e de várias colunas

Você pode definir restrições em uma única coluna ou em várias colunas da mesma tabela.

Para restrições de múltiplas colunas (chaves primárias compostas ou chaves exclusivas), as colunas são ordenadas e cada coluna tem uma sequência de chave correspondente.

Restrições em linha e fora de linha

As restrições são definidas como em linha ou fora de linha durante a criação ou modificação da tabela:

  • As restrições em linha são criadas como parte da definição da coluna e só podem ser usadas para restrições de coluna única.

  • Restrições fora de linha são definidas usando uma cláusula separada que especifica a coluna ou colunas nas quais a restrição é criada. Elas podem ser usadas para criar restrições de coluna única ou de várias colunas, bem como para criar restrições em colunas existentes.

Restrições em GET_DDL

As instruções SQL retornadas por GET_DDL incluem as cláusulas que definem as restrições; no entanto, observe o seguinte:

  • Restrições de coluna única, como NOT NULL e DEFAULT, são reconstruídas em linha com a definição da coluna.

  • As restrições de tabela, como chaves únicas, primárias e estrangeiras, são sempre reconstruídas como restrições fora de linha, mesmo que tenham uma única coluna.

  • Para restrições sem nome (ou seja, restrições com um nome gerado pelo sistema), GET_DDL não retorna o nome gerado pelo sistema.

Restrições CHECK

Uma restrição CHECK impõe uma expressão SQL como uma condição para os valores que podem ser inseridos ou atualizados em uma ou mais colunas de uma tabela. Por exemplo, uma restrição CHECK pode garantir que a coluna quantity de uma tabela tenha apenas valores maiores que zero ou que a coluna salary de uma tabela tenha apenas valores em um intervalo específico.

Você pode especificar uma restrição CHECK usando a cláusula CONSTRAINT nos seguintes comandos SQL:

Você pode mostrar informações sobre as restrições CHECK atuais consultando Exibição CHECK_CONSTRAINTS.

Verifique se as restrições são aplicadas durante as seguintes operações DML:

Se a condição for avaliada como TRUE ou NULL, a operação DML continua. Se a condição for avaliada como FALSE, a restrição CHECK falha.

Para exemplos de restrições CHECK, consulte Exemplos de restrições com tabelas padrão.

Notas de uso

  • As restrições de verificação são sempre aplicadas.

  • Você pode usar os seguintes comandos ALTER TABLE e os equivalentes do Iceberg para trabalhar com restrições CHECK:

    • ALTER TABLE … RENAME CONSTRAINT

    • ALTER TABLE … ADD [ CONSTRAINT <constraint_name> ] CHECK ( <expr> ) ENABLE [ VALIDATE | NOVALIDATE ]

      • ENABLE VALIDATE, o padrão de restrições CHECK, impõe a restrição a todas as linhas existentes e a todas as linhas que são inseridas ou atualizadas após a execução do comando. ENABLEVALIDATE só é compatível com novas tabelas, não tabelas que já existem.

      • ENABLE NOVALIDATE impõe a restrição a todas as linhas inseridas ou atualizadas após executar o comando, mas às linhas que já existem.

    • ALTER TABLE … ALTER CONSTRAINT <constraint_name> ENABLE [ VALIDATE | NOVALIDATE ]

      Se você alterar uma restrição CHECK deNOVALIDATE a VALIDATE, a restrição é aplicada em todas as linhas existentes antes de ser alterada para VALIDATE.

    • ALTER TABLE … DROP CONSTRAINT

  • Os seguintes comandos ALTER TABLE e equivalentes do Iceberg podem operar em uma coluna com uma restrição CHECK definida nela:

    • ALTER TABLE … ALTER COLUMN

      Somente operações que não modificam uma restrição CHECK são compatíveis.

    • ALTER TABLE … RENAME COLUMN

      As restrições de verificação que fazem referência à coluna renomeada são implicitamente atualizadas para usar o novo nome da coluna.

    • ALTER TABLE … DROP COLUMN

      A operação falha se a coluna que está sendo descartada for usada por uma restrição CHECK existente que também faz referência a outra coluna. Nesse caso, exclua a restrição antes de excluir a coluna.

  • Se os registros violarem uma restrição CHECK durante a ingestão, toda a operação de lote falha na primeira vez que encontra um registro que não é válido.

Limitações

  • Somente tabelas padrão e tabelas Iceberg gerenciadas pelo Snowflake são compatíveis com restrições CHECK. Outros tipos, como tabelas híbridas, não são compatíveis com restrições CHECK.

  • A expressão associada a uma restrição CHECK existente não pode ser modificada usando um comando ALTERTABLE. Para modificar a expressão, descarte e recrie a restrição CHECK.

  • Restrições CHECK não podem ser especificadas em comandos CREATEORALTERTABLE.

  • As seguintes operações não são compatíveis com restrições CHECK:

    • Se você tentar executar COPYINTO em uma tabela com restrições CHECK, a operação falhará.

    • Se você tentar criar um canal com uma tabela de destino com restrições CHECK, a operação falhará.

    • Se você tentar ingerir o fluxo em uma tabela com restrições CHECK, a operação falhará.

    • Se você tentar fazer gravações externas em tabelas Iceberg com restrições CHECK, a operação falhará.