Когда я вношу новые элементы (функции) в другой слой Postgres, я могу сделать это двумя способами:
- Рисование новых элементов (с «Добавить объект»), которые я делаю редко или
- Копирование (или вырезание) некоторых элементов из другого слоя Postgre (исходного слоя) и вставка его в целевой слой, что я часто делаю
В первом примере, сохранение правок работает нормально , так как этот слой получает GID из Postgre последовательности базы данных * NEXTVAL ( «layer_name_gid_seq» :: regclass) *
Во втором примере я получил ошибку при сохранении правок, потому что при копировании элемента из исходного слоя в целевой слой qgis скопировал gid элемента из исходного слоя. При попытке сохранить изменения возвращается эта ошибка:
Не удалось зафиксировать изменения в слое «Cjevovodi».
Ошибки: ОШИБКА: 1 функция (и) не добавлена.
Ошибки провайдера:
ошибка PostGIS при добавлении функций: ОШИБКА: двойное значение ключа нарушает уникальное ограничение "cjevovodi_okill_pkey" ПОДРОБНЕЕ
: Ключ (gid) = (5) уже существует.
Я попытался скопировать * nextval ('layer_name_gid_seq' :: regclass) * в поле gid, но эту последовательность нельзя вставить в поле gid, так как поле определено как числовое.
Кто-нибудь знает простой способ скопировать элементы из исходного слоя (с существующим GID) назначить новый GID?
Спасибо!
Ответы:
Я не могу воспроизвести это в Windows QGIS 2.2, c3a2817.
Если другие версии ведут себя по-разному, или если у вас продолжает возникать эта проблема, вы, вероятно, можете установить триггер PostgreSQL на таблицу в качестве обходного пути:
Используя этот пример таблицы:
Вот триггерная функция, которая назначит новую,
gid
где это необходимо:Привязка функции к таблице ...
Это автоматически назначит новые идентификаторы там, где они
gid
уже существуют. Например, следующий запрос теперь будет дублировать все данные в таблице, а не завершаться с ошибкой:Конечно, этот подход может поставить под угрозу назначение вашего первичного ключа, поэтому используйте его осторожно.
источник
Выберите объекты в исходном слое и сохраните выбранное (Save selected as ...) в шейп-файле. Добавьте сохраненный шейп-файл в проект QGIS и откройте таблицу атрибутов, затем удалите поле «gid» и сохраните шейп-файл. Выберите объекты в шейп-файле и скопируйте их на рабочий слой.
источник