Aprenda a criar tabelas corretamente: escolha do schema, nomes de colunas, tipos de dados, nulidade (NULL/NOT NULL), valores padrão (DEFAULT) e comentários (extended properties).
Entender a estrutura mínima de uma tabela e tomar decisões corretas desde o começo: schema, nomes, tipos e regras de preenchimento.
Schema (dbo)O que é / Para que serve: Um schema organiza objetos (tabelas, views, procedures). dbo é o padrão.
Sintaxe: [schema.]NomeObjeto -- ex.: dbo.Produtos
Como funciona: O nome completo de uma tabela é Banco.Schema.Nome. Usar schema evita conflitos de nome e ajuda permissões.
Implicações & boas práticas: • Use dbo por padrão. • Crie schemas por área quando fizer sentido (ex.: cad, fin).
-- Criar um schema (se precisar)
CREATE SCHEMA cad;
GO
-- Tabela no schema 'cad'
CREATE TABLE cad.Clientes (...);
CREATE TABLE (estrutura básica)O que é / Para que serve: Define uma nova tabela com colunas e tipos.
Sintaxe: CREATE TABLE [schema.]Nome ( Coluna Tipo [NULL|NOT NULL] [DEFAULT(expr)] [, ...] );
Como funciona: O SQL cria metadados e reserva páginas para dados conforme necessário.
Implicações & boas práticas: • Escolha tipos corretos (ver módulos 3, 4 e 5). • Defina NOT NULL sempre que possível. • Use DEFAULT para valores padrão.
USE TreinamentoSQL;
GO
CREATE TABLE dbo.Produtos (
ProdutoID INT NOT NULL, -- PK virá no Módulo 7
Nome NVARCHAR(120) NOT NULL,
Categoria NVARCHAR(60) NULL,
Preco DECIMAL(10,2) NOT NULL,
Ativo BIT NOT NULL DEFAULT(1) -- valor padrão
);
NULL vs NOT NULLO que é / Para que serve: Controlar se a coluna aceita ausência de valor.
Sintaxe: Coluna TIPO NULL | NOT NULL
Como funciona: NULL significa 'desconhecido/ausente'. Não é zero, nem string vazia.
Implicações & boas práticas: • Prefira NOT NULL quando a informação é obrigatória. • Use DEFAULT para reduzir NULLs desnecessários.
CREATE TABLE dbo.Contatos (
ContatoID INT NOT NULL,
Email NVARCHAR(200) NOT NULL,
Telefone NVARCHAR(20) NULL
);
DEFAULT (inline)O que é / Para que serve: Preencher automaticamente quando o INSERT omite a coluna.
Sintaxe: Coluna TIPO NOT NULL DEFAULT (expressão)
Como funciona: A expressão é avaliada no INSERT; pode usar GETDATE(), 0, 1 etc.
Implicações & boas práticas: • Use DEFAULT para bandeiras (BIT), datas de criação e números iniciais.
CREATE TABLE dbo.Pedidos (
PedidoID INT NOT NULL,
CriadoEm DATETIME2(3) NOT NULL DEFAULT(SYSDATETIME()),
Ativo BIT NOT NULL DEFAULT(1)
);
INSERT INTO dbo.Pedidos (PedidoID) VALUES (1001);
SELECT * FROM dbo.Pedidos;
Colunas calculadas (computed)O que é / Para que serve: Colunas cujo valor é derivado de outras colunas.
Sintaxe: Coluna AS (expressão) [PERSISTED]
Como funciona: Calculadas em tempo de execução; com PERSISTED, o valor é armazenado e mantido pelo SQL.
Implicações & boas práticas: • Útil para regras repetitivas (ex.: preço * quantidade). • Com PERSISTED é possível indexar a coluna calculada.
CREATE TABLE dbo.ItensPedido (
Qtd INT NOT NULL,
PrecoUnit DECIMAL(10,2) NOT NULL,
Total AS (Qtd * PrecoUnit) PERSISTED
);
INSERT INTO dbo.ItensPedido (Qtd, PrecoUnit) VALUES (3, 99.90);
SELECT Qtd, PrecoUnit, Total FROM dbo.ItensPedido;
Comentários (Extended Properties)O que é / Para que serve: Adicionar documentação às colunas e tabelas.
Sintaxe: sp_addextendedproperty @name=N'MS_Description', @value=N'descrição', ...
Como funciona: Armazena metadados descritivos consultáveis por ferramentas (SSMS, scripts).
Implicações & boas práticas: • Documente colunas críticas. • Facilita manutenção por equipes de suporte.
-- Adiciona descrição na tabela
EXEC sys.sp_addextendedproperty
@name=N'MS_Description', @value=N'Tabela de produtos',
@level0type=N'SCHEMA', @level0name=N'dbo',
@level1type=N'TABLE', @level1name=N'Produtos';
-- Adiciona descrição na coluna
EXEC sys.sp_addextendedproperty
@name=N'MS_Description', @value=N'Preço de venda',
@level0type=N'SCHEMA', @level0name=N'dbo',
@level1type=N'TABLE', @level1name=N'Produtos',
@level2type=N'COLUMN', @level2name=N'Preco';
ALTER TABLE (adicionar/alterar coluna)O que é / Para que serve: Modificar estrutura sem recriar a tabela.
Sintaxe: ALTER TABLE T ADD Col Tipo [NULL|NOT NULL]; | ALTER TABLE T ALTER COLUMN Col NovoTipo [NULL|NOT NULL];
Como funciona: Permite evoluir o esquema; cuidado com dados existentes ao mudar tipo/nulidade.
Implicações & boas práticas: • Antes de tornar NOT NULL, garanta que não existam NULLs. • Alterações grandes podem bloquear a tabela.
ALTER TABLE dbo.Produtos ADD Descricao NVARCHAR(400) NULL;
GO
-- Tornar NOT NULL após preencher
UPDATE dbo.Produtos SET Descricao = N'Sem descrição' WHERE Descricao IS NULL;
ALTER TABLE dbo.Produtos ALTER COLUMN Descricao NVARCHAR(400) NOT NULL;
ClienteID INT, Nome NVARCHAR(120) NOT NULL, Email NVARCHAR(200) NOT NULL, Ativo BIT NOT NULL DEFAULT(1).DEFAULT(SYSDATETIME()).LEFT(Nome,1) e marque como PERSISTED.sp_addextendedproperty.