unicas una secundaria primaria llave hacer foranea eliminar developer crear como claves clave agregar sql postgresql foreign-keys

una - Eliminar filas con clave externa en PostgreSQL



llave secundaria sql (5)

Esto significa que en la tabla kontakty tiene una fila que hace referencia a la fila en osoby que desea eliminar. Primero debe eliminar esa fila o establecer una eliminación en cascada en la relación entre tablas.

Powodzenia!

Me gustaría eliminar las filas que contienen una clave externa, pero cuando intento algo como esto:

DELETE FROM osoby WHERE id_osoby=''1''

Me sale esta declaración:

ERROR: actualizar o eliminar en la tabla "osoby" viola la restricción de clave externa "kontakty_ibfk_1" en la tabla "kontakty" DETALLE: La clave (id_osoby) = (1) todavía se hace referencia a la tabla "kontakty".

¿Cómo puedo eliminar estas filas?


Ha pasado un tiempo desde que se hizo esta pregunta, la esperanza puede ayudar. Debido a que no puede cambiar o alterar la estructura de la base de datos, puede hacer esto. Según los docs postgresql.

TRUNCATE - vacía una tabla o conjunto de tablas.

TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ] [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

Descripción

TRUNCATE elimina rápidamente todas las filas de un conjunto de tablas. Tiene el mismo efecto que un DELETE no calificado en cada tabla, pero como en realidad no escanea las tablas, es más rápido. Además, reclama espacio en el disco de inmediato, en lugar de requerir una operación VACUUM posterior. Esto es más útil en tablas grandes.

Trunque la tabla de otra tabla y haga una cascada a cualquier tabla que haga referencia a otra tabla mediante restricciones de clave foránea:

TRUNCATE othertable CASCADE;

Lo mismo, y también restablecer cualquier generador de secuencia asociado:

TRUNCATE bigtable, fattable RESTART IDENTITY;

Truncar y restablecer cualquier generador de secuencia asociado:

TRUNCATE revinfo RESTART IDENTITY CASCADE ;


No puede eliminar una clave externa si todavía hace referencia a otra tabla. Primero borra la referencia

delete from kontakty where id_osoby = 1; DELETE FROM osoby WHERE id_osoby = 1;


Para automatizar esto, podría definir la restricción de clave foránea con ON DELETE CASCADE .
Cito el manual de restricciones de clave externa :

CASCADE especifica que cuando se elimina una fila a la que se hace referencia, las filas que hacen referencia a ella también deben eliminarse automáticamente.


Uno no debe recomendar esto como una solución general, pero para la eliminación única de filas en una base de datos que no está en producción o en uso activo, es posible que pueda deshabilitar temporalmente los activadores en las tablas en cuestión.

En mi caso, estoy en modo de desarrollo y tengo un par de tablas que se refieren entre sí mediante claves externas. Por lo tanto, eliminar sus contenidos no es tan simple como eliminar todas las filas de una tabla antes de la otra. Entonces, para mí, funcionó bien eliminar sus contenidos de la siguiente manera:

ALTER TABLE table1 DISABLE TRIGGER ALL; ALTER TABLE table2 DISABLE TRIGGER ALL; DELETE FROM table1; DELETE FROM table2; ALTER TABLE table1 ENABLE TRIGGER ALL; ALTER TABLE table2 ENABLE TRIGGER ALL;

Debería poder agregar las cláusulas WHERE según lo desee, por supuesto, con cuidado para evitar socavar la integridad de la base de datos.

Hay una buena discusión relacionada en http://www.openscope.net/2012/08/23/subverting-foreign-key-constraints-in-postgres-or-mysql/