Restrições de Chave Primária no MySQL

Uma chave primária garante a unicidade dos registros e proíbe valores nulos. Em contraste, uma restrição única permite valores nulos, mas impede duplicatas.

  1. Chave Primária Simples

Ao definir uma coluna como chave primária, valores duplicados ou nulos são rejeitados.

CREATE TABLE funcionarios (
    cod_func INT PRIMARY KEY,
    nome_func VARCHAR(30)
);
DESC funcionarios;

Tentativas de inserir valores duplicados na chave primária resultam em erro:

INSERT INTO funcionarios VALUES (1, 'Ana');
-- Sucesso
INSERT INTO funcionarios VALUES (1, 'Carlos');
-- Erro: entrada duplicada

Valores em colunas não-chave podem ser repetidos:

INSERT INTO funcionarios VALUES (2, 'Ana');
SELECT * FROM funcionarios;

A coluna chave primária não aceita nulos, mas outras colunas podem:

INSERT INTO funcionarios VALUES (NULL, 'Ana');
-- Erro: coluna não pode ser nula
INSERT INTO funcionarios VALUES (3, NULL);
SELECT * FROM funcionarios;
  1. Chave Primária Composta

Uma chave primária composta combina duas ou mais colunas. A combinação completa deve ser única, mas individualmente podem ter valores repetidos.

CREATE TABLE pedidos (
    id_pedido INT,
    cod_produto INT,
    descricao VARCHAR(50),
    PRIMARY KEY (id_pedido, cod_produto)
);
DESC pedidos;

Inserções são permitidas se ao menos uma das colunas chave diferir:

INSERT INTO pedidos VALUES (1, 101, 'Item A');
INSERT INTO pedidos VALUES (2, 101, 'Item B');
INSERT INTO pedidos VALUES (1, 102, 'Item C');
SELECT * FROM pedidos;

Nenhuma das colunas chave pode ser nula:

INSERT INTO pedidos VALUES (NULL, 103, 'Item D');
-- Erro: coluna não pode ser nula
  1. Auto-incremento

A propriedade AUTO_INCREMENT gera automaticamente valores sequenciais para a chave primária.

CREATE TABLE usuarios (
    id_usuario INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20)
);
DESC usuarios;

Ao omitir a chave primária na inserção, valores são gerados a partir de 1:

INSERT INTO usuarios (username) VALUES ('maria');
INSERT INTO usuarios (username) VALUES ('joao');
INSERT INTO usuarios (username) VALUES ('ana');
SELECT * FROM usuarios;

Se um valor explícito for fornecido, a sequência continua a partir dele:

DELETE FROM usuarios WHERE username = 'ana';
INSERT INTO usuarios VALUES (100, 'pedro');
INSERT INTO usuarios (username) VALUES ('lucia');
INSERT INTO usuarios (username) VALUES ('carlos');
SELECT * FROM usuarios;
  1. Adicionar e Remover Chave Primária após Criação

É possível modificar a chave primária de uma tabela existente.

CREATE TABLE clientes (
    id_cliente INT,
    nome VARCHAR(25)
);
DESC clientes;

Adicionar chave primária:

ALTER TABLE clientes ADD PRIMARY KEY (id_cliente);
DESC clientes;

Remover chave primária:

ALTER TABLE clientes DROP PRIMARY KEY;
DESC clientes;

Para chaves compostas, o processo é análogo:

ALTER TABLE clientes ADD PRIMARY KEY (id_cliente, nome);
DESC clientes;
ALTER TABLE clientes DROP PRIMARY KEY;
DESC clientes;

Também pode-se usar ALTER TABLE MODIFY para definir a chave primária:

ALTER TABLE clientes MODIFY id_cliente INT PRIMARY KEY;
DESC clientes;
  1. Restrição Única

Uma restrição única impede duplicatas em uma coluna, mas permite valores nulos.

5.1 Adicionar após Criação

CREATE TABLE produtos (
    cod_prod INT,
    nome_prod VARCHAR(30)
);
ALTER TABLE produtos ADD UNIQUE (nome_prod);
DESC produtos;

Valores duplicados na coluna única são rejeitados:

INSERT INTO produtos VALUES (1, 'Monitor');
INSERT INTO produtos VALUES (2, 'Monitor');
-- Erro: entrada duplicada
INSERT INTO produtos VALUES (3, 'Teclado');
INSERT INTO produtos VALUES (4, NULL);
SELECT * FROM produtos;

5.2 Definir na Criação

CREATE TABLE categorias (
    id_categoria INT,
    descricao VARCHAR(40) UNIQUE
);
DESC categorias;

5.3 Restrição Única Composta

CREATE TABLE estoque (
    id_item INT,
    nome_item VARCHAR(20),
    UNIQUE (id_item, nome_item)
);
DESC estoque;

Inserções são permitidas se a combinação for única:

INSERT INTO estoque VALUES (1, 'Parafuso');
INSERT INTO estoque VALUES (2, 'Parafuso');
SELECT * FROM estoque;

5.4 Remover Restrição Única

ALTER TABLE categorias DROP INDEX descricao;
DESC categorias;

5.5 Modificar Restrição Única

ALTER TABLE categorias MODIFY descricao VARCHAR(40) UNIQUE;
DESC categorias;
  1. Restrição NOT NULL

A restrição NOT NULL exige que uma coluna tenha valores, proibindo nulos.

CREATE TABLE fornecedores (
    id_fornecedor INT,
    nome_fornecedor VARCHAR(25) NOT NULL
);
DESC fornecedores;

Inserções sem valor para a coluna NOT NULL falham:

INSERT INTO fornecedores (id_fornecedor) VALUES (1);
-- Erro: campo não tem valor padrão
INSERT INTO fornecedores VALUES (2, 'FornecedorA');
INSERT INTO fornecedores (nome_fornecedor) VALUES ('FornecedorB');
SELECT * FROM fornecedores;
  1. Restrição DEFAULT

A restrição DEFAULT atribui um valor padrão quando nenhum é especificado na inserção.

CREATE TABLE configuracoes (
    id_config INT,
    nome VARCHAR(30),
    valor_padrao INT DEFAULT 0
);
INSERT INTO configuracoes (id_config, nome) VALUES (1, 'Timeout');
SELECT * FROM configuracoes;
  1. Restrição de Chave Estrangeira

Uma chave estrangeira vincula uma coluna a uma chave primária em outra tabela, garantindo integridade referencial.

CREATE TABLE departamentos (
    id_dep INT PRIMARY KEY,
    nome_dep VARCHAR(20)
);

CREATE TABLE empregados (
    id_emp INT PRIMARY KEY,
    nome_emp VARCHAR(30),
    id_dep INT,
    FOREIGN KEY (id_dep) REFERENCES departamentos (id_dep)
);
DESC departamentos;
DESC empregados;

Inserções em deaprtamentos:

INSERT INTO departamentos VALUES (10, 'TI');
INSERT INTO departamentos VALUES (20, 'RH');
INSERT INTO departamentos VALUES (30, 'Financeiro');
SELECT * FROM departamentos;

A chave estrangeira impede referências a valores inexistnetes na tabela principal:

INSERT INTO empregados VALUES (101, 'João', 10);
INSERT INTO empregados VALUES (102, 'Maria', 20);
INSERT INTO empregados VALUES (103, 'Pedro', 40);
-- Erro: restrição de chave estrangeira
SELECT * FROM empregados;

Registros na tabela principal não podem ser excluídos se estiverem referenciados:

DELETE FROM departamentos WHERE id_dep = 10;
-- Erro: operação não permitida devido à restrição

Tags: MySQL Chave Primária Restrições de Integridade Banco de Dados Relacional SQL

Publicado em 6-13 18:28 por Thomas