Обновление ссылочных столбцов в Postgres

Когда есть один или несколько столбцов, которые ссылаются на другой, я пытаюсь найти лучший способ обновить этот столбец при сохранении ссылочной целостности. Например, если у меня есть таблица меток и описаний и две записи:

Label | Description
------------------------------------
read  | This item has been read
READ  | You read this thing already

Мне не нужны эти дубликаты. Я хочу добавить к столбцу ограничение, которое не допускает дублирования значений без учета регистра, как в примере. Однако у меня есть несколько строк из нескольких других таблиц, ссылающихся на «READ», и я хочу отбросить ту.

Я знаю, что Postgres знает, какие поля других строк ссылаются на это, потому что я не могу удалить его, пока они там. Итак, как я могу заставить любое поле, ссылающееся на это, обновить до «читать»? Это всего лишь пример, и у меня есть несколько мест, где я хочу это сделать. Другой пример - это первичный ключ int для нескольких таблиц, где я хочу добавить новую таблицу как своего рода «базовую таблицу», которую расширяют существующие, и поэтому все они теперь должны иметь уникальные идентификаторы, что означает обновление те, которые у них есть.

Я открыт для рецептов функций, которые я могу добавить для этого, инструментов, которые я могу использовать, или чего-либо еще.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
1
0
803
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если у вас много строк, ссылающихся на 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, и READ, вы не сможете обновиться. Я думаю, что вся справочная таблица должна быть обновлена, а затем запись с «READ» должна быть удалена. Если на внешнем ключе установлено «ON DELETE RESTRICT», риск пропустить что-либо отсутствует.

piro 26.10.2008 21:43

почему нет? вам просто нужно быть осторожным, чтобы обновлять правильно, только те, у которых есть 'READ'

Vinko Vrsalovic 26.10.2008 22:18

В будущем вы можете создать уникальный индекс для столбца «label», например:

CREATE UNIQUE INDEX index_name ON table ((lower(label)));

Или проверьте руководство по эксплуатации. Это поможет вам избежать такой ситуации в следующий раз.

да, я знаю это, но суть вопроса в том, как перейти со схемы, которая не защищала от этого, а также как обновить поля, на которые ссылаются, для других ситуаций, когда это необходимо сделать.

ironfroggy 27.10.2008 17:36

Другие вопросы по теме