Несмотря на мой предыдущий ответ, я подтвердил, что перестановка уникальных полей двух постоянных сущностей генерирует ошибку нарушения ограничения , даже если вы делаете это за один проход .
Поэтому я бы сказал, что самый простой способ решить эту проблему - не допустить любых изменений, которые повлекут за собой поле, нарушающее уникальное ограничение, , даже если окончательный результат будет действительным . Это должно быть довольно просто для кодирования на уровне пользовательского интерфейса.
Почему?
Похоже, что по крайней мере MySQL подпадает под это ограничение, как я обнаружил здесь , и, очевидно, не существует простого способа исправить это без серьезных потерь производительности.
Так что можно подумать, что эта проблема может быть легко решена программно. Да, это было бы отстой, но, вероятно, нужно было бы написать какой-то простой код, чтобы проверить, будет ли ваше обновление переставлять два существующих уникальных поля, и сделать это в два шага.
Хотя это может стать волосатым. Представьте себе перестановку 3 экземпляров вместо двух. Например, «A», «B», «C» становится «B», «C», «A». Три шага? Что дальше?