Criando uma Tabela MySQL com PHP
Aprenda a criar uma tabela MySQL com PHP usando mysqli e PDO. Abrange sintaxe CREATE TABLE, tipos de dados, chaves primárias e erros comuns.
Uma tabela é onde o MySQL armazena de fato as suas linhas de dados. Antes de inserir usuários, produtos ou posts, a tabela que os contém precisa existir, com um conjunto definido de colunas e o tipo de dado de cada coluna. Esta página mostra como criar uma tabela MySQL a partir do PHP usando as extensões mysqli e PDO, explica a sintaxe do CREATE TABLE parte por parte e aborda os erros mais comuns que você pode encontrar.
Se você ainda não criou o banco de dados onde a tabela ficará, faça isso primeiro — consulte Criando um Banco de Dados MySQL. Para uma visão mais aprofundada sobre a conexão em si, consulte Conectando ao MySQL com PHP.
Como criar uma tabela funciona
No PHP, criar uma tabela sempre envolve três etapas:
- Conectar ao servidor MySQL e selecionar um banco de dados. Uma tabela deve pertencer a um banco de dados, portanto a conexão precisa saber qual usar.
- Construir o SQL da instrução
CREATE TABLEcomo uma string. Isso é SQL puro — o PHP apenas a entrega ao servidor. - Executar a instrução com
mysqli_query()(mysqli) ou$pdo->exec()(PDO) e verificar se foi bem-sucedida.
O erro mais comum para iniciantes é conectar sem especificar um banco de dados. O CREATE TABLE então falha com "No database selected" porque o servidor não tem onde colocar a tabela. Os exemplos abaixo sempre passam o nome do banco de dados para que isso não aconteça.
Conectando e selecionando um banco de dados
mysqli_connect() recebe o nome do servidor, o nome de usuário e a senha — e, importante, um quarto argumento opcional: o nome do banco de dados. Passe-o para que a nova tabela tenha um destino.
<?php
$server = "localhost";
$username = "username";
$password = "password";
$database = "my_app"; // the database the table will be created in
$conn = mysqli_connect($server, $username, $password, $database);
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>Se você criar o banco de dados no mesmo script, chame mysqli_select_db($conn, "my_app") após criá-lo, ou reconecte com o nome do banco de dados como quarto argumento antes de executar CREATE TABLE.
Criando uma tabela com mysqli
Depois que a conexão tiver um banco de dados selecionado, execute a instrução CREATE TABLE com mysqli_query(). Ela retorna true em caso de sucesso e false em caso de falha, portanto sempre verifique o resultado e exiba mysqli_error() quando falhar — essa mensagem informa exatamente o que deu errado.
O código a seguir cria uma tabela users com três colunas: id, name e email.
<?php
$sql = "CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
email VARCHAR(50) NOT NULL UNIQUE
)";
if (mysqli_query($conn, $sql)) {
echo "Table created successfully";
} else {
echo "Error creating table: " . mysqli_error($conn);
}
?>O que cada parte da instrução significa
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY— um inteiro que nunca pode ser negativo (UNSIGNED), incrementado automaticamente de um em um para cada nova linha (AUTO_INCREMENT) e que identifica exclusivamente cada linha (PRIMARY KEY). Quase toda tabela tem uma coluna assim.name VARCHAR(30) NOT NULL— uma string de comprimento variável de até 30 caracteres.NOT NULLsignifica que um valor é obrigatório; uma inserção sem nome será rejeitada.email VARCHAR(50) NOT NULL UNIQUE— uma string obrigatória com restriçãoUNIQUE, de modo que o MySQL recusa armazenar duas linhas com o mesmo email.
Tipos de dados de coluna comuns
| Tipo | Use para | Exemplo |
|---|---|---|
INT | Números inteiros, IDs, contagens | views INT |
VARCHAR(n) | Texto curto com até n caracteres | name VARCHAR(50) |
TEXT | Texto longo (artigos, comentários) | body TEXT |
DECIMAL(p,s) | Decimais exatos como preços | price DECIMAL(8,2) |
DATE / DATETIME | Datas e timestamps | created_at DATETIME |
BOOLEAN | Flags verdadeiro/falso | active BOOLEAN |
Criando uma tabela com PDO
PDO é a API mais moderna e portátil, sendo preferida para novos projetos. O SQL é idêntico — apenas o wrapper PHP muda. Com o PDO em modo de exceção, você envolve a chamada em um try/catch em vez de verificar um valor de retorno.
<?php
$dsn = "mysql:host=localhost;dbname=my_app";
try {
$pdo = new PDO($dsn, "username", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
email VARCHAR(50) NOT NULL UNIQUE
)";
$pdo->exec($sql);
echo "Table created successfully";
} catch (PDOException $e) {
echo "Error creating table: " . $e->getMessage();
}
?>Evitando o erro "table already exists"
Se você executar uma instrução CREATE TABLE duas vezes, a segunda execução falha com "Table 'users' already exists". Adicione IF NOT EXISTS para tornar a instrução segura de ser re-executada — o MySQL simplesmente ignora a criação quando a tabela já existe.
<?php
$sql = "CREATE TABLE IF NOT EXISTS users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
email VARCHAR(50) NOT NULL UNIQUE
)";
mysqli_query($conn, $sql);
?>Erros comuns e correções
- "No database selected" — você conectou sem especificar um banco de dados. Passe-o como quarto argumento para
mysqli_connect()ou usemysqli_select_db(). - "Table 'users' already exists" — use
CREATE TABLE IF NOT EXISTS, ou exclua a tabela antiga primeiro. - "You have an error in your SQL syntax" — geralmente uma vírgula indevida após a última coluna, ou uma palavra reservada como
orderusada como nome de coluna sem crases. Envolva esses nomes em crases:`order`. - "Access denied for user" — a conta MySQL não tem privilégios
CREATEnesse banco de dados.
Próximos passos
Agora que a tabela existe, você pode começar a trabalhar com os dados nela:
- Inserir dados em uma tabela MySQL
- Selecionar dados de uma tabela MySQL
- Usar prepared statements para inserir dados de usuário com segurança
- Visão geral da extensão mysqli
Resumo
Criar uma tabela no PHP resume-se a conectar com um banco de dados selecionado, escrever uma instrução CREATE TABLE que define cada coluna e seu tipo, e executá-la com mysqli_query() ou PDO::exec(). Sempre verifique erros, adicione IF NOT EXISTS para scripts que você pode re-executar, e escolha um tipo de dado sensato para cada coluna para que o MySQL armazene seus dados de forma eficiente e segura.