2008-10-26 4 views
0

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

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

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

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

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

ответ

1

Если у вас есть много строк, ссылающихся на 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>' 
+0

mmm ... если у вас есть «чтение» и «READ», вы не сможете обновить. Я думаю, что вся таблица ссылок должна быть обновлена, а затем запись с «READ» отброшена. С «ON DELETE RESTRICT» по внешнему ключу нет никакого риска пропустить что-либо. – piro

+0

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

0

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

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

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

+0

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

Смежные вопросы