Mantenha o SQLtest vivo: Ajude a cobrir os custos do servidor de $100 deste mês para manter todas as lições e o playground SQL online. Apoie o projeto →
Código SQL copiado para a área de transferência

Lição 9.1 · Tempo de leitura: ~9 min

A instrução SQL CREATE TABLE cria uma nova tabela: as suas colunas, os tipos de dados e as regras que os dados devem cumprir. Nesta lição, você vai aprender a definir colunas, escolher tipos de dados e usar as principais restrições: PRIMARY KEY, NOT NULL, UNIQUE, DEFAULT, CHECK e FOREIGN KEY.

SQL CREATE TABLE: Definir uma Tabela

Até agora você trabalhou com tabelas que já existiam. O CREATE TABLE pertence à Linguagem de Definição de Dados (DDL): comandos que definem a estrutura de um banco de dados, e não os seus dados. Uma tabela bem desenhada guarda os dados de forma compacta, rejeita valores inválidos e mantém consistentes as relações entre tabelas.

Os exemplos usam a sintaxe do MySQL e do MariaDB. Os bancos de exemplo do SQLtest são somente leitura, por isso pratique estas instruções no playground, num banco sem dados de exemplo.

SQL CREATE TABLE: nomes de colunas com tipos de dados, chave primária com AUTO_INCREMENT, restrições NOT NULL, UNIQUE, DEFAULT e CHECK, e uma chave estrangeira para outra tabela

Sintaxe do CREATE TABLE

CREATE TABLE table_name (
    column1 data_type constraints,
    column2 data_type constraints,
    table_constraints
);

Cada coluna tem um nome, um tipo de dados e, opcionalmente, restrições e parâmetros. As restrições que envolvem várias colunas, como uma chave primária composta, escrevem-se depois das colunas.


Uma Primeira Tabela

CREATE TABLE students (
    student_id INT,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    birth_date DATE,
    created_at TIMESTAMP
);

Resultado: uma tabela students vazia com cinco colunas.

Esta tabela funciona, mas aceita qualquer coisa: ids repetidos, alunos sem nome. As restrições resolvem isso.


Escolher os Tipos de Dados

Tipo de dadosGuardaExemplo
INT, BIGINTNúmeros inteirosids, quantidades
DECIMAL(p, s)Números exatos com s casas decimaisdinheiro: DECIMAL(10, 2)
VARCHAR(n)Texto até n caracteresnomes, e-mails
TEXTTexto longodescrições
DATEUma data do calendáriodata de nascimento
DATETIME, TIMESTAMPData e horamomento de criação
BOOLEANVerdadeiro ou falso (TINYINT(1) no MySQL)indicadores

Escolha o tipo mais estreito que serve os dados: poupa espaço e rejeita valores errados. Guarde dinheiro em DECIMAL, não em FLOAT, que não consegue representar exatamente muitas frações decimais. Leia mais na lição sobre tipos de dados.


Chave Primária e AUTO_INCREMENT

Uma chave primária identifica cada linha: os seus valores são únicos e nunca NULL. Uma chave substituta costuma ser gerada pelo banco de dados com AUTO_INCREMENT:

CREATE TABLE students (
    student_id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL
);

INSERT INTO students (first_name, last_name)
VALUES ('ANNA', 'LEE'), ('MARK', 'STONE');

SELECT * FROM students;

Resultado: dois alunos com student_id 1 e 2, gerados automaticamente.

Outros bancos geram chaves de outra forma: o PostgreSQL usa GENERATED ALWAYS AS IDENTITY ou SERIAL, o SQL Server IDENTITY(1, 1).


NOT NULL, UNIQUE e DEFAULT

CREATE TABLE employees (
    employee_id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    hire_date DATE NOT NULL,
    salary DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • NOT NULL: a coluna tem de ter um valor.
  • UNIQUE: duas linhas não podem ter o mesmo valor. Valores NULL são permitidos e não contam como duplicados.
  • DEFAULT: o valor usado quando um INSERT não fornece nenhum.
-- Erro: Column 'hire_date' cannot be null
INSERT INTO employees (first_name, last_name, hire_date)
VALUES ('JOHN', 'DOE', NULL);

Restrições CHECK

O CHECK define uma condição que cada linha tem de cumprir:

CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) NOT NULL CHECK (price >= 0),
    discount_pct INT DEFAULT 0 CHECK (discount_pct BETWEEN 0 AND 90)
);

-- Erro: Check constraint 'products_chk_1' is violated
INSERT INTO products (product_name, price) VALUES ('Broken', -5);

O MySQL aplica o CHECK desde a versão 8.0.16 e o MariaDB desde a 10.2; versões mais antigas do MySQL aceitavam a sintaxe, mas ignoravam a condição.


Chaves Estrangeiras

Uma chave estrangeira liga uma coluna à chave primária de outra tabela. O banco de dados passa a rejeitar valores que não existem na tabela referenciada:

CREATE TABLE departments (
    department_id INT AUTO_INCREMENT PRIMARY KEY,
    department_name VARCHAR(100) NOT NULL UNIQUE
);

CREATE TABLE staff (
    staff_id INT AUTO_INCREMENT PRIMARY KEY,
    full_name VARCHAR(100) NOT NULL,
    department_id INT NOT NULL,
    FOREIGN KEY (department_id) REFERENCES departments (department_id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
);

INSERT INTO departments (department_name) VALUES ('Sales');
INSERT INTO staff (full_name, department_id) VALUES ('ANNA LEE', 1);

-- Erro: a foreign key constraint fails (o departamento 99 não existe)
INSERT INTO staff (full_name, department_id) VALUES ('MARK STONE', 99);

O ON DELETE define o que acontece às linhas filhas quando uma linha referenciada é removida:

OpçãoQuando a linha pai é removida
RESTRICT / NO ACTIONA remoção é recusada enquanto existirem linhas filhas (o padrão)
CASCADEAs linhas filhas também são removidas
SET NULLA coluna filha passa a NULL

O ON UPDATE funciona da mesma forma quando a chave referenciada muda. No Sakila, a maioria das chaves estrangeiras usa ON DELETE RESTRICT, e por isso não foi possível remover um cliente com aluguéis na Lição 8.3.


IF NOT EXISTS

Criar uma tabela que já existe é um erro. O IF NOT EXISTS salta a criação nesse caso, o que é útil em scripts executados mais de uma vez:

CREATE TABLE IF NOT EXISTS departments (
    department_id INT AUTO_INCREMENT PRIMARY KEY,
    department_name VARCHAR(100) NOT NULL
);

Repare que as estruturas não são comparadas: se já existir uma tabela com esse nome mas com outras colunas, ela fica como está.


Codificação de Texto

Para colunas de texto, o MySQL e o MariaDB permitem definir o conjunto de caracteres e a collation:

CREATE TABLE customers (
    customer_id INT AUTO_INCREMENT PRIMARY KEY,
    full_name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
) DEFAULT CHARSET = utf8mb4;

O utf8mb4 guarda qualquer caractere Unicode, incluindo emoji; a collation define como as strings são comparadas e ordenadas. Desde o MySQL 8.0, utf8mb4 é o padrão.


Principais conclusões:

  • O CREATE TABLE define colunas, tipos de dados e restrições; a nova tabela fica vazia.
  • Escolha tipos de dados precisos; use DECIMAL para dinheiro.
  • A PRIMARY KEY identifica as linhas; o AUTO_INCREMENT gera os valores da chave.
  • NOT NULL, UNIQUE, DEFAULT e CHECK mantêm os dados válidos.
  • A FOREIGN KEY liga tabelas; o ON DELETE define o que acontece às linhas filhas.
  • O IF NOT EXISTS evita um erro quando a tabela já existe.

Perguntas Frequentes

Como criar uma tabela com chave primária em SQL?

Adicione PRIMARY KEY à coluna chave: CREATE TABLE students (student_id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL);. Para uma chave de várias colunas, escreva PRIMARY KEY (col1, col2) depois da lista de colunas.

Qual é a diferença entre PRIMARY KEY e UNIQUE?

Ambas proíbem duplicados. Uma tabela tem só uma chave primária, e as suas colunas não podem ser NULL. Uma tabela pode ter várias restrições UNIQUE, e elas permitem valores NULL.

Como adicionar uma chave estrangeira no CREATE TABLE?

Escreva FOREIGN KEY (column) REFERENCES other_table (key_column) depois das colunas, opcionalmente com as ações ON DELETE e ON UPDATE. A coluna referenciada tem de ser chave primária ou única.

Tente resolver as tarefas a seguir para reforcar o que voce aprendeu nesta licao.

  1. Crie a tabela de departamento
  2. Tabela de estatísticas do Penguin
  3. Criar tabela pinguins