Когда есть один или несколько столбцов, которые ссылаются на другой, я пытаюсь найти лучший способ обновить этот столбец при сохранении ссылочной целостности. Например, если у меня есть таблица меток и описаний и две записи:
Label | Description
------------------------------------
read | This item has been read
READ | You read this thing already
Мне не нужны эти дубликаты. Я хочу добавить к столбцу ограничение, которое не допускает дублирования значений без учета регистра, как в примере. Однако у меня есть несколько строк из нескольких других таблиц, ссылающихся на «READ», и я хочу отбросить ту.
Я знаю, что Postgres знает, какие поля других строк ссылаются на это, потому что я не могу удалить его, пока они там. Итак, как я могу заставить любое поле, ссылающееся на это, обновить до «читать»? Это всего лишь пример, и у меня есть несколько мест, где я хочу это сделать. Другой пример - это первичный ключ int для нескольких таблиц, где я хочу добавить новую таблицу как своего рода «базовую таблицу», которую расширяют существующие, и поэтому все они теперь должны иметь уникальные идентификаторы, что означает обновление те, которые у них есть.
Я открыт для рецептов функций, которые я могу добавить для этого, инструментов, которые я могу использовать, или чего-либо еще.

Если у вас много строк, ссылающихся на READ, вы можете изменить внешний ключ для каскадного обновления, обновить эту таблицу, установив Label = 'read', где Label = 'READ', и все будет автоматически исправлено. После этого вы можете снова изменить ограничение, чтобы оно оставалось прежним.
Чтобы найти все таблицы, ссылающиеся на столбец, вы можете использовать
select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from
INFORMATION_SCHEMA.KEY_COLUMN_USAGE where
REFERENCED_TABLE_NAME = '<table>' AND REFERENCED_COLUMN_NAME = '<column>'
почему нет? вам просто нужно быть осторожным, чтобы обновлять правильно, только те, у которых есть 'READ'
В будущем вы можете создать уникальный индекс для столбца «label», например:
CREATE UNIQUE INDEX index_name ON table ((lower(label)));
Или проверьте руководство по эксплуатации. Это поможет вам избежать такой ситуации в следующий раз.
да, я знаю это, но суть вопроса в том, как перейти со схемы, которая не защищала от этого, а также как обновить поля, на которые ссылаются, для других ситуаций, когда это необходимо сделать.
ммм ... если у вас есть и read, и READ, вы не сможете обновиться. Я думаю, что вся справочная таблица должна быть обновлена, а затем запись с «READ» должна быть удалена. Если на внешнем ключе установлено «ON DELETE RESTRICT», риск пропустить что-либо отсутствует.