W3docs

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:

  1. 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.
  2. Construir o SQL da instrução CREATE TABLE como uma string. Isso é SQL puro — o PHP apenas a entrega ao servidor.
  3. 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";

?>
Informação

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 NULL significa que um valor é obrigatório; uma inserção sem nome será rejeitada.
  • email VARCHAR(50) NOT NULL UNIQUE — uma string obrigatória com restrição UNIQUE, de modo que o MySQL recusa armazenar duas linhas com o mesmo email.

Tipos de dados de coluna comuns

TipoUse paraExemplo
INTNúmeros inteiros, IDs, contagensviews INT
VARCHAR(n)Texto curto com até n caracteresname VARCHAR(50)
TEXTTexto longo (artigos, comentários)body TEXT
DECIMAL(p,s)Decimais exatos como preçosprice DECIMAL(8,2)
DATE / DATETIMEDatas e timestampscreated_at DATETIME
BOOLEANFlags verdadeiro/falsoactive 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 use mysqli_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 order usada como nome de coluna sem crases. Envolva esses nomes em crases: `order`.
  • "Access denied for user" — a conta MySQL não tem privilégios CREATE nesse banco de dados.

Próximos passos

Agora que a tabela existe, você pode começar a trabalhar com os dados nela:

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.

Prática

Prática
Quais são as etapas necessárias para criar uma tabela MySQL em PHP?
Quais são as etapas necessárias para criar uma tabela MySQL em PHP?
Was this page helpful?