Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Problemas con paso de e/r a sql

Estas en el tema de Problemas con paso de e/r a sql en el foro de PostgreSQL en Foros del Web. Buenas, resulta que estoy con un trabajillo en el que tengo un pequeño problema. En el esquema e/r tengo algo asi: http://gyazo.com/52c04bb13d70ee63a2a41245f6028b64 A tiene una ...
  #1 (permalink)  
Antiguo 23/11/2014, 05:09
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 5 años, 11 meses
Puntos: 0
Problemas con paso de e/r a sql

Buenas, resulta que estoy con un trabajillo en el que tengo un pequeño problema.
En el esquema e/r tengo algo asi: http://gyazo.com/52c04bb13d70ee63a2a41245f6028b64

A tiene una fk de B en el campo b1, y B tiene una fk de C en el campo c1, el problema es que al representar la tabla debil con doble pk (el discriminante propio y la pk de la entidad fuerte), despues, al referenciar a B desde A por medio de b1, me salta el siguiente error
ERROR: el número de columnas referidas en la llave foránea no coincide con el número de columnas de referencia

********** Error **********

ERROR: el número de columnas referidas en la llave foránea no coincide con el número de columnas de referencia
SQL state: 42830


Mi codigo es el siguiente:


--Esta tabla D al caso es irrelevante


Código SQL:
Ver original
  1. CREATE TABLE D (
  2. d1 INTEGER PRIMARY KEY,
  3. d2 INTEGER
  4. );
  5.  
  6.  
  7. CREATE TABLE C (
  8. c1 INTEGER PRIMARY KEY,
  9. c2 INTEGER,
  10. d1 INTEGER REFERENCES D
  11. );
  12.  
  13.  
  14. CREATE TABLE B (
  15. b1 INTEGER UNIQUE,
  16. --discriminante por ser tabla debil dependiente de C
  17. b2 INTEGER,
  18. c1 INTEGER REFERENCES C,
  19. PRIMARY KEY (c1, b1)
  20.  
  21. );
  22.  
  23.  
  24.  
  25. CREATE TABLE A (
  26. a1 INTEGER PRIMARY KEY REFERENCES A,
  27. a2 INTEGER,
  28. b1 INTEGER NOT NULL REFERENCES B
  29.  
  30. );

Última edición por gnzsoloyo; 23/11/2014 a las 06:15
  #2 (permalink)  
Antiguo 23/11/2014, 06:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 12 años, 11 meses
Puntos: 2656
Respuesta: Problemas con paso de e/r a sql

Cita:
ERROR: el número de columnas referidas en la llave foránea no coincide con el número de columnas de referencia
El problema que tienes es simple y concreto, y se puede entender con solo el mensaje de error si lo interpretas en base al modelo E-R: Una de las FK apunta a un campo que no tiene un único campo como PK. Debe ser una PK compuesta por más de uno, y una de las primeras reglas de una FK es que debe tener la misma cantidad de campos, del mimo tipo y en el mismo orden de la PK a la que apunta.
¿Se entiende?
La adición de la FK no se hace sobre cada columna, sino sobre las dos al mismo tiempo.

Te recomiendo leer con atención el manual de referencia de PostgreSQL ante este tipo de cosas. Es lo que hacemos los que nos dedicamos a BBDD.

El ejemplo de ese manual es suficientemente claro:
Código SQL:
Ver original
  1. CREATE TABLE t1 (
  2.   a INTEGER PRIMARY KEY,
  3.   b INTEGER,
  4.   c INTEGER,
  5.   FOREIGN KEY (b, c) REFERENCES other_table (c1, c2)
  6. );

Fuente: http://www.postgresql.org/docs/9.3/s...nstraints.html
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 23/11/2014 a las 06:32
  #3 (permalink)  
Antiguo 23/11/2014, 06:50
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 5 años, 11 meses
Puntos: 0
Respuesta: Problemas con paso de e/r a sql

Gracias por la rápida respuesta.
A ver si lo he entendido, el código casca por no estar especificada la FK de la tabla A hacia la tabla B por el campo b1 no?
Entonces, ¿bastaría con poner b1 INTEGER NOT NULL REFERENCES B (b1) ?
O por el contrario debería traerme el segundo campo de la PK compuesta de B a la tabla A donde hago la referencia y meterla dentro de la FK
Un saludo y gracias nuevamente
  #4 (permalink)  
Antiguo 23/11/2014, 07:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 12 años, 11 meses
Puntos: 2656
Respuesta: Problemas con paso de e/r a sql

No estas entendiendolo que te dije al principio. Vuelve a leerlo con detenimiento:
Tienes una tabla con una PK compuesta por dos campos, entonces cuando creas una FK hacia esa tabla, La FK debe ser de dos campos y definida al mismo tiempo.
Mira el ejemplo que te puse.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 23/11/2014, 07:23
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 5 años, 11 meses
Puntos: 0
Respuesta: Problemas con paso de e/r a sql

A ver si lo entiendo, te estas refiriendo que en el momento de declarar la FK, tendría que declararla de dos campos, ambos del mismo tipo que los que referencio en la clave primaria, y ademas fuera de linea, es decir, las dos al mismo tiempo, ¿estoy en lo cierto?
  #6 (permalink)  
Antiguo 23/11/2014, 08:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 12 años, 11 meses
Puntos: 2656
Respuesta: Problemas con paso de e/r a sql

Mira el ejemplo que te posteo. Allí se ve claramente cómo se hace.

¿Por qué dudas tanto?

mira, te completo el ejemplo a ver si ese entiende mejro:
Código SQL:
Ver original
  1. CREATE TABLE other_table (
  2.     c1 INTEGER,
  3.     c2 INTEGER,
  4.     c3 INTEGER,
  5.     PRIMARY KEY (c1, c2)
  6. );
  7.  
  8. CREATE TABLE t1 (
  9.   a INTEGER PRIMARY KEY,
  10.   b INTEGER,
  11.   c INTEGER,
  12.   FOREIGN KEY (b, c) REFERENCES other_table (c1, c2)
  13. );
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 23/11/2014 a las 08:32
  #7 (permalink)  
Antiguo 23/11/2014, 09:12
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 5 años, 11 meses
Puntos: 0
Respuesta: Problemas con paso de e/r a sql

Ya entiendo, es mas o menos como lo planteaba en la anterior respuesta, al ser una pk compuesta la de la tabla referenciada, en la declaracion de la fk es necesario referenciar dos campos, en mi caso dejando asi la tabla A
Código SQL:
Ver original
  1. CREATE TABLE A (
  2. a1 INTEGER PRIMARY KEY REFERENCES A,
  3. a2 INTEGER,
  4. b1 INTEGER NOT NULL,
  5. c1 INTEGER,
  6. FOREIGN KEY (c1, b1) REFERENCES B (c1, b1)
  7. );
Un saludo y gracias por la ayuda

Última edición por sbd02; 23/11/2014 a las 10:50

Etiquetas: columna, paso, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:46.