Resources

How to fix missing MySQL primary keys in UpCloud Managed Databases

Published on: September 17, 2025

Primary keys are fundamental to MySQL's design. In UpCloud Managed Databases for MySQL, they ensure data integrity, enable efficient querying, and are essential for MySQL replication. Without them, you may encounter replication failures, backup issues, or performance problems during database upgrades.

This guide helps you identify tables lacking primary keys and provides step-by-step instructions for creating them within your UpCloud Managed MySQL Database service

When you might need this guide

You'll typically encounter missing primary key issues when:

  • MySQL replication fails with primary key warnings
  • Database backups fail due to missing primary keys
  • Upgrading MySQL versions (newer versions are stricter about primary keys)
  • Migrating from other database systems

Identifying tables without primary keys

Connect to your UpCloud Managed MySQL database and run this query to find affected tables:

SELECT
    tab.table_schema AS database_name,
    tab.table_name AS table_name,
    tab.table_rows AS table_rows
FROM information_schema.tables tab
LEFT JOIN information_schema.table_constraints tco
    ON (tab.table_schema = tco.table_schema
        AND tab.table_name = tco.table_name
        AND tco.constraint_type = 'PRIMARY KEY')
WHERE
    tab.table_schema NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys')
    AND tco.constraint_type IS NULL
    AND tab.table_type = 'BASE TABLE'
ORDER BY
    tab.table_schema,
    tab.table_name;
```xml

Take note of the `database_name` and `table_name` from the output, as you will use for the next steps.

## Reviewing table structure

Before adding primary keys, examine each affected table's structure:

```sql
SHOW CREATE TABLE <database_name>.<table_name>;

Look for columns that contain unique values or could form a unique identifier. This determines your strategy below.

Important for large tables: If your table has millions of rows, see the troubleshooting section below before proceeding. ALTER TABLE operations on large tables can fail without proper configuration.

Checking for duplicate data

Before adding primary keys, verify that your chosen columns actually contain unique data. Duplicate values will cause the ALTER TABLE operation to fail.

For single column primary keys

SELECT <column_name>, COUNT(*) 
FROM <database_name>.<table_name> 
GROUP BY <column_name> 
HAVING COUNT(*) > 1;
```dockerfile

**For composite primary keys**

```sql
SELECT <column1>, <column2>, COUNT(*)
FROM <database_name>.<table_name>
GROUP BY <column1>, <column2>
HAVING COUNT(*) > 1;

If these queries return any results, you have duplicate data that must be resolved before adding primary keys. Consider:

  • Removing duplicate rows
  • Using a different column combination
  • Adding an auto-incrementing ID instead (Option 2 below)

Adding primary keys

Choose the appropriate option based on your table structure:

Option 1: Using existing columns

For single column primary keys

If you have a column with unique, non-null values:

ALTER TABLE <database_name>.<table_name> ADD PRIMARY KEY (<column_name>);
```sql

Example:
```sql
-- Assuming you're working with database 'mydatabase'
CREATE TABLE mydatabase.person (
    social_security_number VARCHAR(30) NOT NULL,
    first_name TEXT,
    last_name TEXT
);

ALTER TABLE mydatabase.person ADD PRIMARY KEY (social_security_number);

For composite primary keys

When no single column guarantees uniqueness, but a combination does:

ALTER TABLE <database_name>.<table_name> ADD PRIMARY KEY (<column1>, <column2>);
```sql

Example:
```sql
-- Assuming you're working with database 'mydatabase'
CREATE TABLE mydatabase.team_membership (
    user_id BIGINT NOT NULL,
    team_id BIGINT NOT NULL,
    role VARCHAR(50)
);

-- user_id + team_id combination is unique
ALTER TABLE mydatabase.team_membership ADD PRIMARY KEY (user_id, team_id);

Option 2: Adding an auto-incrementing ID

When existing columns can't reliably serve as a primary key (due to duplicates or NULL values):

ALTER TABLE <database_name>.<table_name> ADD COLUMN id BIGINT PRIMARY KEY AUTO_INCREMENT FIRST;

The FIRST option places the new ID column at the beginning, following common convention.

Troubleshooting large table errors

When working with large tables, you may encounter this error:

ERROR 1878 (HY000): Creating index 'PRIMARY' required more than 
'mysql.innodb_online_alter_log_max_size' bytes of modification log. Please try again.

This happens because the operation exceeds MySQL's configured log size limit.

To resolve:

  1. Access your UpCloud Control Panel
  2. Navigate to Databases → select your MySQL service
  3. Go to Properties tab
  4. Find innodb_online_alter_log_max_size parameter
  5. Set a larger value based on your table size:
    • Small tables (< 1M rows): 1GB (1073741824)
    • Medium tables (1-10M rows): 4GB (4294967296)
    • Large tables (> 10M rows): 8GB or higher
  6. Save configuration changes
  7. Retry your ALTER TABLE statement
  8. Important: Revert this setting to default after completion if high values aren't typically needed

Summary

Adding primary keys is essential database maintenance that prevents replication issues and ensures optimal performance. Always test schema changes in a non-production environment when possible, and remember to adjust MySQL configuration parameters for large table operations.

Contributed by: Far Sarayno

Can't find what you're looking for?

For more help you can contact our awesome 24/7 support team