Magento 2 Declarative Schema: Unraveling the 'Duplicate Key Name' Error for Developers
At Shopping Mover, we understand that robust and efficient database management is the backbone of any successful e-commerce platform, especially when dealing with complex systems like Magento 2. Magento's declarative schema, introduced in version 2.3, was a game-changer, simplifying database schema modifications and migrations for developers. It allows modules to define their database structure in XML, letting Magento intelligently handle the underlying SQL operations.
However, even the most powerful tools can have their quirks. A recently confirmed bug in Magento 2.4-develop (and impacting earlier 2.4.x versions) has highlighted a critical flaw where the declarative schema can lead to frustrating "Duplicate key name" errors. This issue specifically arises when a custom module attempts to declare a unique constraint on the same columns as an index that already exists within the database.
The Core Problem: SQLSTATE 42000: 1061 Duplicate Key Name
The issue, meticulously reported as GitHub Issue #41307 by lbajsarowicz, surfaces during crucial development operations like bin/magento setup:upgrade or even a fresh setup:install. Developers are confronted with the dreaded SQLSTATE[42000]: Syntax error or access violation: 1061 Duplicate key name error. This isn't just a minor inconvenience; it halts the upgrade process, making further development or deployment impossible until the conflicting module is removed or modified.
The root cause lies in how Magento's declarative schema generates names for database elements. Under specific conditions, it can generate identical names for a unique constraint and a regular index if both cover the exact same set of columns within a table. MySQL, being strict about database integrity, naturally rejects the creation of a second key with an identical name, leading to the fatal error.
A Real-World Example: The eav_attribute_label Table
The bug report provides a clear example involving the eav_attribute_label table, a core Magento entity. The Magento_Eav module already declares an index on the attribute_id and store_id columns. If a custom module, perhaps aiming to enforce data integrity more strictly, attempts to add a unique constraint on these very same columns, a naming collision occurs. The declarative schema, in its current state, generates the same internal name for both the existing index and the new unique constraint, causing the upgrade to fail.
Reproducing the Issue: A Developer's Guide
Understanding how to reproduce this bug is crucial for developers to identify and mitigate it. Here are the steps as outlined in the GitHub issue:
- Install Magento 2.4-develop: Ensure you are working with a Magento 2.4.x environment, as the issue is confirmed for this branch.
- Create a Custom Module: Develop a new module (e.g.,
Vendor_Module) with a dependency onMagento_Eav. - Define a Conflicting
db_schema.xml: Within your custom module, create anetc/db_schema.xmlfile with the following content:
4. Run bin/magento setup:upgrade: Execute this command. You will observe the upgrade process halting with the aforementioned SQLSTATE[42000]: Syntax error or access violation: 1061 Duplicate key name error.
This failure is persistent; subsequent runs of setup:upgrade will also fail until the conflicting module is removed or its db_schema.xml is modified.

Why the Collision Happens: Naming Conventions
The core of the problem lies in Magento's declarative schema naming logic. The system often ignores the referenceId attribute when constructing the actual database object name, especially if the generated name (derived from the table and column names) is shorter than 64 characters. In such cases, a regular index and a unique constraint on the same columns will end up with the exact same generated name (e.g., EAV_ATTRIBUTE_LABEL_ATTRIBUTE_ID_STORE_ID). Since Magento_Eav already defines an index with this name, the attempt to add a unique constraint with the identical name fails.
Previous attempts to fix similar issues, such as adding a type prefix to every generated name, were declined because they would have caused existing indexes on live installations to be renamed – a highly undesirable side effect. The challenge for the Magento core team is to implement a fix that resolves the collision for new declarations without altering existing database structures.
Impact on Magento 2 Development and Migrations
For developers and e-commerce businesses, this bug presents significant challenges:
- Blocked Development: Custom module development that requires unique constraints on commonly indexed columns can be severely hampered, leading to delays.
- Migration Hurdles: During Magento 1 to Magento 2 migrations, or even upgrades between Magento 2 versions, integrating custom modules or third-party extensions that trigger this bug can cause unexpected failures, prolonging the migration timeline and increasing costs. At Shopping Mover, we emphasize thorough pre-migration testing to catch such issues early.
- Debugging Complexity: The error message, while specific, might not immediately point to the declarative schema's naming conflict, requiring deeper investigation into module dependencies and schema definitions.
- System Instability: A failed
setup:upgradeleaves the system in an inconsistent state, potentially leading to further issues.
The Solution: Awaiting the Fix
The good news is that the Magento core team has confirmed the issue and is working on a resolution. The expected outcome, as per the release note in the GitHub issue, is that: "Declarative schema no longer fails with 'Duplicate key name' when a module adds a unique constraint on the same columns as an existing index."
This fix will be a welcome improvement, enhancing the stability and predictability of Magento 2's declarative schema, especially for complex custom module development and seamless integrations.
Best Practices for Magento Developers
While awaiting the official fix, here are some best practices to minimize your exposure to such issues and ensure smoother development and migrations:
- Thorough Testing: Always perform comprehensive testing of
setup:upgradeandsetup:installin development and staging environments before deploying to production. - Schema Awareness: Be mindful of existing Magento core indexes when defining custom constraints. Review core module
db_schema.xmlfiles if you suspect a conflict. - Unique Naming: While the bug affects generated names, always use descriptive and unique
referenceIdvalues in yourdb_schema.xmlfor clarity and future maintainability. - Stay Updated: Keep your Magento 2 instance updated to the latest patch versions to benefit from bug fixes and performance improvements.
- Leverage
db_schema_whitelist.json: Understand and utilize thedb_schema_whitelist.jsonfile for managing schema changes, especially during complex migrations.
At Shopping Mover, we specialize in navigating the intricacies of Magento 2, from development challenges to seamless migrations. Understanding and addressing issues like the declarative schema's "Duplicate key name" error is part of our commitment to delivering stable and high-performing e-commerce solutions. If you're facing persistent Magento 2 development issues or planning a complex migration, don't hesitate to contact our expert team for assistance.