Skip to main content

❌ Common MySQL Errors

A reference guide to the most frequently encountered MySQL errors, what causes them, and how to fix them. When you hit an error, search for the error number on this page.

📑 Sections

Syntax Errors

ERROR 1064: Syntax Error

Message: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '...' at line X

Common Causes:

  • Missing or extra comma, parenthesis, or semicolon
  • Typo in a keyword (SELCET instead of SELECT)
  • Using a reserved word as a column or table name without backticks
  • Running mysqldump from inside the mysql> prompt
  • Missing quotes around string values

How to Fix:


-- Look at what comes AFTER "near" in the error — that's where MySQL got confused

-- Bad: reserved word as column name
CREATE TABLE orders (order INT);           -- 'order' is reserved!

-- Fix: use backticks or a different name
CREATE TABLE orders (`order` INT);         -- Works but not recommended
CREATE TABLE orders (order_number INT);    -- Better: avoid reserved words

-- Bad: missing comma
SELECT title price FROM books;

-- Fix: add the comma
SELECT title, price FROM books;
                    

ERROR 1054: Unknown Column

Message: Unknown column 'column_name' in 'field list'

Common Causes:

  • Typo in the column name
  • Column doesn't exist in the table
  • Forgot to specify the table alias in a join
  • Using a column alias in WHERE (not allowed — use HAVING or repeat the expression)

How to Fix:


-- Check the actual column names
DESCRIBE books;

-- Bad: alias used in WHERE
SELECT price * 0.9 AS sale_price FROM books WHERE sale_price < 10;

-- Fix: repeat the expression or use HAVING
SELECT price * 0.9 AS sale_price FROM books WHERE price * 0.9 < 10;
                    

ERROR 1055: Non-aggregated Column in GROUP BY

Message: Expression #N of SELECT list is not in GROUP BY clause and contains nonaggregated column

Cause:

You selected a column that isn't in GROUP BY and isn't inside an aggregate function.

How to Fix:


-- Bad: title is not aggregated or grouped
SELECT author_id, title, COUNT(*) FROM books GROUP BY author_id;

-- Fix Option 1: Add to GROUP BY
SELECT author_id, title, COUNT(*) FROM books GROUP BY author_id, title;

-- Fix Option 2: Use an aggregate
SELECT author_id, MAX(title), COUNT(*) FROM books GROUP BY author_id;

-- Fix Option 3: Remove the non-aggregated column
SELECT author_id, COUNT(*) FROM books GROUP BY author_id;
                    

Table & Database Errors

ERROR 1046: No Database Selected

Message: No database selected

Cause:

You ran a query without first selecting a database with USE.

How to Fix:


-- Select the database first
USE bookstore;

-- Then run your query
SELECT * FROM books;

-- Or specify the database in the query
SELECT * FROM bookstore.books;
                    

ERROR 1049: Unknown Database

Message: Unknown database 'database_name'

Cause:

The database name is misspelled or doesn't exist.

How to Fix:


-- List all databases to check the name
SHOW DATABASES;

-- Create it if it doesn't exist
CREATE DATABASE IF NOT EXISTS bookstore;
                    

ERROR 1050: Table Already Exists

Message: Table 'table_name' already exists

How to Fix:


-- Use IF NOT EXISTS to avoid the error
CREATE TABLE IF NOT EXISTS books (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200)
);

-- Or drop the table first (careful — this deletes all data!)
DROP TABLE IF EXISTS books;
                    

ERROR 1146: Table Doesn't Exist

Message: Table 'database.table_name' doesn't exist

Common Causes:

  • Typo in the table name
  • Wrong database selected
  • Table hasn't been created yet
  • Case sensitivity on Linux (tables are case-sensitive on Linux, not on Windows/macOS)

How to Fix:


-- Check current database and list tables
SELECT DATABASE();
SHOW TABLES;
                    

Data & Constraint Errors

ERROR 1062: Duplicate Entry

Message: Duplicate entry 'value' for key 'key_name'

Cause:

You're trying to insert or update a value that violates a UNIQUE constraint or PRIMARY KEY.

How to Fix:


-- Check existing values
SELECT * FROM users WHERE email = 'john@example.com';

-- Option 1: Use INSERT ... ON DUPLICATE KEY UPDATE
INSERT INTO users (email, name) VALUES ('john@example.com', 'John')
ON DUPLICATE KEY UPDATE name = VALUES(name);

-- Option 2: Use INSERT IGNORE (silently skips duplicates)
INSERT IGNORE INTO users (email, name) VALUES ('john@example.com', 'John');

-- Option 3: Use a different unique value
                    

ERROR 1048: Column Cannot Be NULL

Message: Column 'column_name' cannot be null

Cause:

You're inserting or updating a NOT NULL column with a NULL value (or not providing a value for a required column).

How to Fix:


-- Provide a value for the required column
INSERT INTO books (title, price) VALUES ('My Book', 9.99);

-- Or alter the column to allow NULLs (if appropriate)
ALTER TABLE books MODIFY COLUMN price DECIMAL(10,2) NULL;

-- Or add a default value
ALTER TABLE books MODIFY COLUMN price DECIMAL(10,2) DEFAULT 0.00;
                    

ERROR 1451: Cannot Delete — Foreign Key Constraint

Message: Cannot delete or update a parent row: a foreign key constraint fails

Cause:

You're trying to delete a row that other rows depend on via a foreign key (and the action is RESTRICT or NO ACTION).

How to Fix:


-- Option 1: Delete the child rows first
DELETE FROM books WHERE author_id = 5;
DELETE FROM authors WHERE id = 5;

-- Option 2: Change the foreign key to CASCADE
ALTER TABLE books DROP FOREIGN KEY fk_author;
ALTER TABLE books ADD CONSTRAINT fk_author
    FOREIGN KEY (author_id) REFERENCES authors(id) ON DELETE CASCADE;

-- Option 3: Set child values to NULL
ALTER TABLE books DROP FOREIGN KEY fk_author;
ALTER TABLE books ADD CONSTRAINT fk_author
    FOREIGN KEY (author_id) REFERENCES authors(id) ON DELETE SET NULL;
                    

ERROR 1452: Cannot Add — Foreign Key Constraint

Message: Cannot add or update a child row: a foreign key constraint fails

Cause:

You're inserting a foreign key value that doesn't exist in the parent table.

How to Fix:


-- Check if the parent record exists
SELECT * FROM authors WHERE id = 99;

-- Insert the parent record first, then the child
INSERT INTO authors (id, name) VALUES (99, 'New Author');
INSERT INTO books (title, author_id) VALUES ('New Book', 99);
                    

ERROR 1406: Data Too Long

Message: Data too long for column 'column_name' at row N

Cause:

The value exceeds the column's maximum length (e.g., inserting 300 characters into a VARCHAR(200)).

How to Fix:


-- Check the column's current limit
DESCRIBE books;

-- Increase the column size
ALTER TABLE books MODIFY COLUMN title VARCHAR(500);

-- Or truncate the data before inserting
                    

ERROR 1366: Incorrect Value for Column

Message: Incorrect integer value: 'abc' for column 'id' at row 1

Cause:

You're inserting a value that doesn't match the column's data type (e.g., text into an INT column).

How to Fix:

Make sure the value matches the column type. Check for accidental quotes around numbers or missing quotes around strings.

Connection & Access Errors

ERROR 1045: Access Denied

Message: Access denied for user 'username'@'host' (using password: YES)

Common Causes:

  • Wrong password
  • Wrong username
  • User doesn't exist for that host (e.g., 'user'@'localhost' exists but 'user'@'%' does not)

How to Fix:


-- Check if the user exists
SELECT User, Host FROM mysql.user WHERE User = 'username';

-- Reset the password (as root)
ALTER USER 'username'@'localhost' IDENTIFIED BY 'NewPassword!';

-- Make sure you're using -p (with password prompt)
-- mysql -u username -p
                    

ERROR 1142: Command Denied

Message: DELETE command denied to user 'user'@'localhost' for table 'books'

Cause:

The user doesn't have the required privilege for the operation.

How to Fix:


-- Check the user's privileges
SHOW GRANTS FOR 'user'@'localhost';

-- Grant the missing privilege (as root)
GRANT DELETE ON bookstore.books TO 'user'@'localhost';
                    

ERROR 2002: Can't Connect to MySQL Server

Message: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

Cause:

The MySQL server isn't running.

How to Fix:


# Start the MySQL service
sudo service mysql start

# Check if it's running
sudo service mysql status

# If using systemd:
sudo systemctl start mysql
sudo systemctl status mysql
                    

ERROR 2003: Can't Connect to MySQL Server on 'host'

Message: Can't connect to MySQL server on 'hostname' (111)

Common Causes:

  • MySQL isn't configured to accept remote connections
  • Firewall blocking port 3306
  • Wrong hostname or IP address

How to Fix:


# Check if MySQL is listening on the network
sudo netstat -tlnp | grep 3306

# Edit MySQL config to allow remote connections
# In /etc/mysql/mysql.conf.d/mysqld.cnf:
# Change: bind-address = 127.0.0.1
# To:     bind-address = 0.0.0.0

# Restart MySQL
sudo service mysql restart
                    

Import/Export Errors

ERROR 1290: --secure-file-priv

Message: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

Cause:

Your INTO OUTFILE or LOAD DATA INFILE path is outside the allowed directory.

How to Fix:


-- Check the allowed directory
SHOW VARIABLES LIKE 'secure_file_priv';

-- Use the allowed path in your query
-- e.g., /var/lib/mysql-files/
SELECT * INTO OUTFILE '/var/lib/mysql-files/export.csv' ...
                    

ERROR 13: Can't Get Stat / Permission Denied (File Operations)

Message: Can't get stat of '/path/file.csv' (OS errno 13 - Permission denied)

Cause:

The MySQL server process doesn't have permission to read or write the file.

How to Fix:


# Use /tmp or the secure_file_priv directory
# Or adjust file permissions
chmod 644 /path/to/file.csv
chown mysql:mysql /path/to/file.csv
                    

File Already Exists (INTO OUTFILE)

Message: File '/path/file.csv' already exists

Cause:

INTO OUTFILE will not overwrite existing files.

How to Fix:


# Delete the existing file from the terminal
rm /tmp/export.csv

# Then re-run your query
                    

ERROR 3948: LOAD DATA LOCAL INFILE Disabled

Message: Loading local data is disabled; this must be enabled on both the client and server side

How to Fix:


-- Enable on the server
SET GLOBAL local_infile = 1;
                    

# Reconnect with LOCAL enabled
mysql -u root -p --local-infile=1 bookstore
                    

Procedure & Function Errors

ERROR 1304: Procedure/Function Already Exists

Message: PROCEDURE my_proc already exists

How to Fix:


-- Drop and recreate
DROP PROCEDURE IF EXISTS my_proc;

-- Then create the procedure
DELIMITER //
CREATE PROCEDURE my_proc()
BEGIN
    -- ...
END //
DELIMITER ;
                    

ERROR 1418: No DETERMINISTIC or NO SQL

Message: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration

Cause:

Binary logging is enabled and MySQL requires functions to declare their nature.

How to Fix:


-- Add DETERMINISTIC (if the function always returns the same output for the same input)
CREATE FUNCTION my_func(x INT) RETURNS INT
DETERMINISTIC
BEGIN
    RETURN x * 2;
END;

-- Or READS SQL DATA (if it reads from tables but doesn't write)
CREATE FUNCTION my_func(x INT) RETURNS INT
READS SQL DATA
BEGIN
    RETURN (SELECT COUNT(*) FROM books WHERE author_id = x);
END;
                    

DELIMITER Confusion

Symptom: Procedure/function creation fails or only runs the first line.

Cause:

You forgot to change the delimiter before CREATE PROCEDURE / CREATE FUNCTION, so MySQL treats the first semicolon inside the body as the end of the statement.

How to Fix:


-- Always set DELIMITER before and after
DELIMITER //
CREATE PROCEDURE my_proc()
BEGIN
    SELECT 1;   -- This semicolon doesn't end the CREATE statement
    SELECT 2;
END //
DELIMITER ;
                    

General Debugging Tips

✅ Read the Error Message Carefully

MySQL errors always include: the error number, a description, and often the exact position where it got confused. The text after near '...' in syntax errors shows where to look.

✅ Use SHOW WARNINGS

After any statement, run SHOW WARNINGS; to see any warnings MySQL generated but didn't stop for (truncated data, implicit type conversions, etc.).

✅ Check Your Context


-- What database am I in?
SELECT DATABASE();

-- Who am I logged in as?
SELECT CURRENT_USER();

-- What tables exist?
SHOW TABLES;

-- What columns does this table have?
DESCRIBE my_table;
                    

✅ Test Before You Modify

Before running UPDATE or DELETE, run a SELECT with the same WHERE clause to verify which rows will be affected.

✅ Start Small, Build Up

If a complex query fails, simplify it. Start with the basic SELECT, then add WHERE, then JOIN, then GROUP BY, testing at each step.