Entenda como definir valores padrão automáticos (DEFAULT) e validar dados na entrada (CHECK). Controle de qualidade no nível do banco — robusto e centralizado.
Aprender a usar DEFAULT para preencher valores automaticamente e CHECK para impedir dados inválidos, além de boas práticas e armadilhas comuns.
DEFAULT (inline na coluna)O que é / Para que serve: Define um valor padrão para preencher quando a coluna é omitida no INSERT.
Sintaxe: Coluna TIPO [NOT NULL] DEFAULT (expressão)
Como funciona: A expressão é avaliada a cada INSERT; pode usar funções como SYSDATETIME(), valores literais, etc.
Implicações & boas práticas: • Use para datas de criação, flags BIT e valores numéricos iniciais. • Evite agora diferente entre app e banco — centralize no banco.
CREATE TABLE dbo.Pedidos (
PedidoID INT IDENTITY PRIMARY KEY,
CriadoEm DATETIME2(3) NOT NULL DEFAULT (SYSDATETIME()),
Ativo BIT NOT NULL DEFAULT (1)
);
INSERT INTO dbo.Pedidos DEFAULT VALUES;
SELECT PedidoID, CriadoEm, Ativo FROM dbo.Pedidos;
DEFAULT (nomeado como constraint)O que é / Para que serve: Permite dar nome próprio à constraint de DEFAULT, útil para manutenção (DROP/ALTER).
Sintaxe: CONSTRAINT DF_Tabela_Col DEFAULT (expressão)
Como funciona: O comportamento é o mesmo do inline; a vantagem é manter padronização de nomes.
Implicações & boas práticas: • Padrão de nomes ajuda devops: DF_Tabela_Coluna. • Fica fácil localizar e alterar no futuro.
CREATE TABLE dbo.Usuarios (
UsuarioID INT IDENTITY PRIMARY KEY,
Nome NVARCHAR(100) NOT NULL,
Ativo BIT NOT NULL CONSTRAINT DF_Usuarios_Ativo DEFAULT (1)
);
-- Localizar defaults da tabela
SELECT name, definition
FROM sys.default_constraints dc
JOIN sys.columns c ON c.default_object_id = dc.object_id
WHERE OBJECT_NAME(dc.parent_object_id) = 'Usuarios';
CHECK (na coluna)O que é / Para que serve: Valida o conteúdo de uma coluna com uma expressão booleana.
Sintaxe: Coluna TIPO CONSTRAINT CK_Tabela_Col CHECK (expressão)
Como funciona: A linha só é aceita se a expressão resultar TRUE (não UNKNOWN).
Implicações & boas práticas: • Centraliza regras simples de domínio (ex.: preço >= 0). • Evite funções não determinísticas (nem todas são permitidas).
CREATE TABLE dbo.Produtos (
ProdutoID INT IDENTITY PRIMARY KEY,
Nome NVARCHAR(100) NOT NULL,
Preco DECIMAL(10,2) NOT NULL
CONSTRAINT CK_Produtos_Preco_Pos CHECK (Preco >= 0)
);
-- Falha:
-- INSERT INTO dbo.Produtos (Nome, Preco) VALUES (N'Teclado', -10.00);
CHECK (na tabela — envolvendo múltiplas colunas)O que é / Para que serve: Permite expressões que dependem de mais de uma coluna.
Sintaxe: CONSTRAINT CK_Tabela_Nome CHECK (Col1 <= Col2 AND Col3 IN (...))
Como funciona: A expressão é avaliada considerando a linha inteira (todas as colunas).
Implicações & boas práticas: • Regras de intervalo (ex.: Inicio <= Fim) e combinações válidas.
CREATE TABLE dbo.Promocoes (
PromocaoID INT IDENTITY PRIMARY KEY,
Inicio DATE NOT NULL,
Fim DATE NOT NULL,
DescontoPercent DECIMAL(5,2) NOT NULL,
CONSTRAINT CK_Promocoes_Intervalo CHECK (Inicio <= Fim),
CONSTRAINT CK_Promocoes_Desconto CHECK (DescontoPercent BETWEEN 0 AND 100)
);
ALTER TABLE ... ADD CONSTRAINT DEFAULTO que é / Para que serve: Adicionar DEFAULT após a criação da tabela.
Sintaxe: ALTER TABLE T ADD CONSTRAINT DF_T_Col DEFAULT (expr) FOR Col;
Como funciona: O DEFAULT passa a valer para novos INSERTs que omitirem a coluna.
Implicações & boas práticas: • Não retroage nas linhas existentes. • Para preencher histórico, rode um UPDATE antes.
ALTER TABLE dbo.Usuarios
ADD CONSTRAINT DF_Usuarios_CriadoEm DEFAULT (SYSDATETIME()) FOR CriadoEm;
-- Dados antigos continuam NULL até você atualizar
UPDATE dbo.Usuarios SET CriadoEm = SYSDATETIME() WHERE CriadoEm IS NULL;
ALTER TABLE ... ADD CONSTRAINT CHECKO que é / Para que serve: Adicionar validação sem recriar a tabela.
Sintaxe: ALTER TABLE T ADD CONSTRAINT CK_T_Col CHECK (expressão);
Como funciona: O SQL valida as linhas existentes (a menos que WITH NOCHECK — não recomendado).
Implicações & boas práticas: • Prefira validar dados existentes e usar WITH CHECK. • WITH NOCHECK deixa dados “legados” fora da regra.
-- Validar todos os dados existentes
ALTER TABLE dbo.Produtos WITH CHECK
ADD CONSTRAINT CK_Produtos_Preco_Pos CHECK (Preco >= 0);
GETDATE()) podem não ser permitidas.Preco DECIMAL(10,2) NOT NULL e um DEFAULT de 0.00. Insira uma linha omitindo o preço e verifique o valor aplicado.Preco >= 0 e teste um INSERT inválido.Inicio <= Fim e DescontoPercent entre 0 e 100.