Crear una tabla MySQL con PHP
Aprende a crear una tabla MySQL con PHP usando mysqli y PDO. Incluye sintaxis CREATE TABLE, tipos de datos, claves primarias y errores comunes.
Una tabla es donde MySQL almacena realmente las filas de datos. Antes de poder insertar usuarios, productos o publicaciones, la tabla que los contendrá debe existir, con un conjunto definido de columnas y el tipo de dato de cada columna. Esta página muestra cómo crear una tabla MySQL desde PHP usando las extensiones mysqli y PDO, explica la sintaxis de CREATE TABLE pieza por pieza y cubre los errores más frecuentes.
Si aún no has creado la base de datos donde vivirá la tabla, hazlo primero — consulta Crear una base de datos MySQL. Para un análisis más detallado de la conexión en sí, consulta Conectarse a MySQL con PHP.
Cómo funciona la creación de una tabla
Desde PHP, crear una tabla siempre consta de tres pasos:
- Conectar al servidor MySQL y seleccionar una base de datos. Una tabla debe pertenecer a una base de datos, por lo que la conexión debe saber cuál usar.
- Construir la sentencia SQL
CREATE TABLEcomo una cadena de texto. Esto es SQL estándar — PHP simplemente la envía al servidor. - Ejecutar la sentencia con
mysqli_query()(mysqli) o$pdo->exec()(PDO) y verificar si tuvo éxito.
El error más común para principiantes es conectarse sin indicar una base de datos. CREATE TABLE falla entonces con "No database selected" porque el servidor no sabe dónde colocar la tabla. Los ejemplos a continuación siempre pasan el nombre de la base de datos para evitar este problema.
Conectarse y seleccionar una base de datos
mysqli_connect() recibe el nombre del servidor, el usuario y la contraseña — y, lo que es importante, un cuarto argumento opcional: el nombre de la base de datos. Pásalo para que la nueva tabla tenga un lugar donde residir.
<?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";
?>Si creas la base de datos en el mismo script, llama a mysqli_select_db($conn, "my_app") después de crearla, o vuelve a conectar con el nombre de la base de datos como cuarto argumento antes de ejecutar CREATE TABLE.
Crear una tabla con mysqli
Una vez que la conexión tiene seleccionada una base de datos, ejecuta la sentencia CREATE TABLE con mysqli_query(). Devuelve true en caso de éxito y false en caso de error, así que comprueba siempre el resultado e imprime mysqli_error() cuando falle — ese mensaje te indica exactamente qué salió mal.
El siguiente código crea una tabla users con tres columnas: id, name y 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);
}
?>Qué significa cada parte de la sentencia
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY— un entero que nunca puede ser negativo (UNSIGNED), que aumenta automáticamente en uno por cada nueva fila (AUTO_INCREMENT) y que identifica de forma única cada fila (PRIMARY KEY). Casi todas las tablas tienen una columna como esta.name VARCHAR(30) NOT NULL— una cadena de longitud variable de hasta 30 caracteres.NOT NULLsignifica que el valor es obligatorio; una inserción sin nombre será rechazada.email VARCHAR(50) NOT NULL UNIQUE— una cadena obligatoria con una restricciónUNIQUE, de modo que MySQL rechaza almacenar dos filas con el mismo correo electrónico.
Tipos de datos de columna más comunes
| Tipo | Úsalo para | Ejemplo |
|---|---|---|
INT | Números enteros, IDs, contadores | views INT |
VARCHAR(n) | Texto corto de hasta n caracteres | name VARCHAR(50) |
TEXT | Texto largo (artículos, comentarios) | body TEXT |
DECIMAL(p,s) | Decimales exactos como precios | price DECIMAL(8,2) |
DATE / DATETIME | Fechas y marcas de tiempo | created_at DATETIME |
BOOLEAN | Indicadores verdadero/falso | active BOOLEAN |
Crear una tabla con PDO
PDO es la API más moderna y portable, y se prefiere para proyectos nuevos. El SQL es idéntico — solo cambia el envoltorio PHP. Con PDO en modo excepción, envuelves la llamada en un try/catch en lugar de comprobar un 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();
}
?>Evitar el error "la tabla ya existe"
Si ejecutas una sentencia CREATE TABLE dos veces, la segunda ejecución falla con "Table 'users' already exists". Añade IF NOT EXISTS para que la sentencia sea segura de volver a ejecutar — MySQL simplemente omite la creación cuando la tabla ya 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);
?>Errores comunes y soluciones
- "No database selected" — te conectaste sin indicar una base de datos. Pásala como cuarto argumento a
mysqli_connect()o usamysqli_select_db(). - "Table 'users' already exists" — usa
CREATE TABLE IF NOT EXISTS, o elimina la tabla antigua primero. - "You have an error in your SQL syntax" — generalmente es una coma sobrante después de la última columna, o una palabra reservada como
orderusada como nombre de columna sin comillas graves. Rodea esos nombres con comillas graves:`order`. - "Access denied for user" — la cuenta MySQL no tiene privilegios
CREATEen esa base de datos.
Próximos pasos
Ahora que la tabla existe, puedes empezar a trabajar con los datos que contiene:
- Insertar datos en una tabla MySQL
- Seleccionar datos de una tabla MySQL
- Usar sentencias preparadas para insertar datos de usuario de forma segura
- Descripción general de la extensión mysqli
Resumen
Crear una tabla desde PHP se reduce a conectarse con una base de datos seleccionada, escribir una sentencia CREATE TABLE que defina cada columna y su tipo, y ejecutarla con mysqli_query() o PDO::exec(). Comprueba siempre los errores, añade IF NOT EXISTS para scripts que puedas volver a ejecutar, y elige un tipo de dato adecuado para cada columna para que MySQL almacene tus datos de forma eficiente y segura.