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.
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 dados | Guarda | Exemplo |
|---|---|---|
INT, BIGINT | Números inteiros | ids, quantidades |
DECIMAL(p, s) | Números exatos com s casas decimais | dinheiro: DECIMAL(10, 2) |
VARCHAR(n) | Texto até n caracteres | nomes, e-mails |
TEXT | Texto longo | descrições |
DATE | Uma data do calendário | data de nascimento |
DATETIME, TIMESTAMP | Data e hora | momento de criação |
BOOLEAN | Verdadeiro 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. ValoresNULLsão permitidos e não contam como duplicados.DEFAULT: o valor usado quando umINSERTnã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ção | Quando a linha pai é removida |
|---|---|
RESTRICT / NO ACTION | A remoção é recusada enquanto existirem linhas filhas (o padrão) |
CASCADE | As linhas filhas também são removidas |
SET NULL | A 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 TABLEdefine colunas, tipos de dados e restrições; a nova tabela fica vazia. - Escolha tipos de dados precisos; use
DECIMALpara dinheiro. - A
PRIMARY KEYidentifica as linhas; oAUTO_INCREMENTgera os valores da chave. NOT NULL,UNIQUE,DEFAULTeCHECKmantêm os dados válidos.- A
FOREIGN KEYliga tabelas; oON DELETEdefine o que acontece às linhas filhas. - O
IF NOT EXISTSevita 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.