У нас есть база данных Oracle, и у нас есть таблица, в которой мы храним много данных. В этой таблице есть первичный ключ, и обычно эти первичные ключи только создаются при вставке новой строки.ORA-00001: Уникальная константа: установка основных ключей вручную
Но теперь нам нужно вручную вставить данные в эту таблицу с помощью определенных фиксированных первичных ключей. Невозможно изменить эти первичные ключи.
Так, например:
Наша таблица имеет уже 20 записей с первичными ключами 1 до 20. Теперь нам нужно добавить данные вручную с помощью первичных ключей 21 до 23.
Когда кто-то хочет ввести строку, используя наш стандартный подход, процесс вставки завершится неудачно из-за:
Caused by: java.sql.BatchUpdateException: ORA-00001: Unique Constraint (VDMA.SYS_C0013552) verletzt
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10500)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:230)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
Я полностью понимаю this: Процедура (последовательность) базы данных, которая создает следующий первичный ключ, терпит неудачу, потому что уже сделан следующий первичный ключ.
Но: Как я могу рассказать о своей последовательности, чтобы снова взглянуть на таблицу и понять, что следующий первичный ключ равен 24, а не 21?
UPDATE
Причина, почему идентификаторы должны остаться такой же, потому что получает доступ к записи с помощью веб-интерфейса с помощью ссылки, которые содержат идентификатор. Таким образом, либо мы меняем реализацию, сопоставляя старые идентификаторы с новыми идентификаторами, либо сохраняем идентификаторы в базе данных.
UPDATE2
Найдено решение: Поскольку мы используем спящий режим, только одна последовательность заполнения всех таблиц. Таким образом, первичные ключи в те 4 дня, когда я искал ответ, были настолько высокими, что я мог с уверенностью импортировать все данные.
«* Теперь нам нужно добавить данные вручную с помощью первичных ключей от 21 до 23 *» - не делайте этого. Используйте эту последовательность, чтобы вставить эти значения. Все остальное вызовет у вас проблемы. Вы не можете заставить последовательность «смотреть» на таблицу. Единственный способ изменить значение последовательности - это вызвать 'nextval' или удалить и повторно создать последовательность с новым стартовым значением. –
Может ли воссоздать последовательность помощи? – Breiti
Продвиньте последовательность, один раз, к следующему доступному идентификатору на основе максимального значения, которое вы вставили вручную. –