Error
Error Code:
3728
MySQL Error 3728: Invalid Spatial Index Definition
Description
This error occurs when you attempt to define a PRIMARY KEY or UNIQUE constraint directly on a column that is also intended for a SPATIAL INDEX. MySQL's spatial indexing capabilities are designed for spatial data types and do not support the enforcement of uniqueness or primary key constraints on the spatial data itself.
Error Message
Spatial indexes can't be primary or unique indexes.
Known Causes
3 known causesPRIMARY KEY on Spatial Column
You tried to define a spatial column (e.g., GEOMETRY, POINT) as the PRIMARY KEY for the table.
UNIQUE Constraint on Spatial Column
You attempted to apply a UNIQUE constraint directly to a column with a spatial data type.
Conflicting Index Definitions
Your CREATE TABLE or ALTER TABLE statement included definitions that implicitly or explicitly combined a spatial index with a primary or unique constraint.
Solutions
3 solutions available1. Remove Primary Key Constraint from Spatial Column easy
Modify the table to remove the primary key constraint from the column that has a spatial index.
1
Identify the table and column that has the primary key constraint and is intended to have a spatial index. You can usually find this by looking at your `CREATE TABLE` statement or by inspecting the table schema.
2
Drop the existing primary key constraint from the table. If the spatial column is the *only* column with a primary key, you'll need to designate another column (or a combination of columns) as the new primary key. If the spatial column is part of a composite primary key, you'll need to restructure the primary key.
ALTER TABLE your_table_name DROP PRIMARY KEY;
3
If you removed the primary key and need to re-establish it on a different column(s), add a new primary key constraint.
ALTER TABLE your_table_name ADD PRIMARY KEY (id_column);
4
Now, create the spatial index on the desired column. Ensure this column is of a spatial data type (e.g., `GEOMETRY`, `POINT`, `POLYGON`).
ALTER TABLE your_table_name ADD SPATIAL INDEX index_name (spatial_column_name);
2. Remove Unique Constraint from Spatial Column easy
Modify the table to remove the unique constraint from the column that has a spatial index.
1
Identify the table and column that has the unique constraint and is intended to have a spatial index. Examine your `CREATE TABLE` statement or use `SHOW INDEXES FROM your_table_name;` to identify unique indexes.
2
Drop the unique index. The command to drop an index is `DROP INDEX`. Note that unique indexes are also created using `CREATE UNIQUE INDEX` or implicitly with `ALTER TABLE ADD UNIQUE INDEX`.
ALTER TABLE your_table_name DROP INDEX index_name_of_unique_constraint;
3
Create the spatial index on the column. Make sure the column has a spatial data type.
ALTER TABLE your_table_name ADD SPATIAL INDEX index_name (spatial_column_name);
3. Restructure Table for Separate Indexing medium
If the spatial data must also be uniquely identified, consider a surrogate key or a composite key that doesn't include the spatial column.
1
Analyze your data model. Determine if the spatial data itself needs to be unique, or if it's always associated with a unique identifier that is *not* the spatial column.
2
If you currently have a primary key on the spatial column, remove it.
ALTER TABLE your_table_name DROP PRIMARY KEY;
3
Add a new, non-spatial primary key column (e.g., an auto-incrementing integer) if one doesn't exist.
ALTER TABLE your_table_name ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY FIRST;
4
Ensure your spatial column has a spatial data type.
5
Create the spatial index on the spatial column.
ALTER TABLE your_table_name ADD SPATIAL INDEX index_name (spatial_column_name);