Curso SQL Server — Edição Definitiva

Módulo 6 — CREATE TABLE (básico): schemas, colunas, tipos, nulidade e DEFAULT

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).

Objetivo

Entender a estrutura mínima de uma tabela e tomar decisões corretas desde o começo: schema, nomes, tipos e regras de preenchimento.

Constraints como PRIMARY KEY, FOREIGN KEY e CHECK serão aprofundadas nos próximos módulos — aqui você monta a base.

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 NULL

O 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;

Exercícios práticos

  1. Crie a tabela dbo.Clientes com colunas: ClienteID INT, Nome NVARCHAR(120) NOT NULL, Email NVARCHAR(200) NOT NULL, Ativo BIT NOT NULL DEFAULT(1).
  2. Adicione uma coluna DataCadastro DATETIME2(3) com DEFAULT(SYSDATETIME()).
  3. Inclua uma coluna calculada PrimeiraLetra com a expressão LEFT(Nome,1) e marque como PERSISTED.
  4. Documente a coluna Email usando sp_addextendedproperty.

Referências oficiais & leituras recomendadas