Pregunta

Cuando hay una o más columnas que hacen referencia a otra, estoy luchando por la mejor manera de actualizar esa columna mientras mantengo la integridad referencial. Por ejemplo, si tengo una tabla de etiquetas y descripciones y dos entradas:

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

Ahora, no quiero estos duplicados. Quiero agregar una restricción a la columna que no permita valores que sean duplicados sin distinción de mayúsculas y minúsculas, como en el ejemplo. Sin embargo, tengo varias filas de varias otras tablas que hacen referencia a "LEER", la que quiero eliminar.

Sé que Postgres sabe a qué campos de otras filas hacen referencia a esto, porque no puedo eliminarlos mientras estén allí. Entonces, ¿cómo podría obtener cualquier campo que haga referencia a esto para actualizarse a 'leer'? Esto es solo un ejemplo, y en realidad tengo algunos lugares donde quiero hacer esto. Otro ejemplo es en realidad una clave primaria int para unas pocas tablas, donde quiero agregar una nueva tabla como una especie de "tabla base" que se extienden a las existentes y, por lo tanto, todas necesitarán tener identificadores únicos ahora, lo que significa una actualización los que tienen.

Estoy abierto a recetas para funciones que puedo agregar para hacer esto, herramientas que puedo utilizar o cualquier otra cosa.

¿Fue útil?

Solución

Si tiene muchas filas que hacen referencia a LEER, puede modificar la clave externa para que esté en la actualización en cascada, actualizar el conjunto de tablas Etiqueta = 'leer' donde Etiqueta = 'LEER' y todo se solucionará automáticamente. Después de eso, puedes volver a modificar la restricción para que sea como era antes.

Para encontrar todas las tablas que hacen referencia a la columna, puede utilizar

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>'

Otros consejos

En el futuro, puede crear un índice único en la columna " etiqueta " ;, por ejemplo:

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

O consulte el manual . Eso te ayudaría a evitar esta situación para la próxima vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top