Estoy creando una base de datos de servicio de transmisión de películas y programas de televisión (para un proyecto escolar) usando Postgres 9.6.2. Me encuentro con el siguiente error:
no hay una restricción única que coincida con las claves dadas para la tabla de referencia "episodios vistos"
La tabla TVratings a continuación tomará un programa de televisión, siempre que un usuario haya visto al menos un episodio (que aparece en la tabla WatchedEpisodes) y le permita calificarlo. Dado que WatchedEpisodes tiene una clave principal compuesta de la identificación del usuario, la identificación del programa de televisión, la temporada y el episodio, no me permitirá hacer referencia desde esa tabla a una clave compuesta de solo uid y tid.
CREATE TABLE WatchedEpisodes ( uid int unique references Users(uid), tid int, season int, episode int, FOREIGN KEY(tid, season, episode) REFERENCES Episodes(tid, season, episode), PRIMARY KEY (uid, tid, season, episode) ); CREATE TABLE TVRatings ( uid int, tid int, rating int check (rating > 0 and rating < 6), FOREIGN KEY(uid, tid) REFERENCES WatchedEpisodes(uid,tid), PRIMARY KEY(uid, tid) );Me pregunto si hay una manera de hacer referencia solo a una parte de esa clave compuesta. Estas son solo dos de mis tablas, por lo que si se necesita más información, puedo agregar más.
Esto está realmente en la especificación, pero aún no está implementado. Se llama MATCH PARTIAL
CREATE TABLE foo ( a int, b int, c int, PRIMARY KEY (a,b,c) ); CREATE TABLE bar ( a int, b int, FOREIGN KEY (a,b) REFERENCES foo (a,b) MATCH PARTIAL );Puedes leer sobre esto en los documentos ,
Un valor insertado en la(s) columna(s) de referencia se compara con los valores de la tabla a la que se hace referencia y las columnas a las que se hace referencia utilizando el tipo de coincidencia dado. Hay tres tipos de coincidencia: PARTIDA COMPLETA, PARTIDA PARCIAL y PARTIDA SIMPLE (que es la predeterminada). MATCH FULL no permitirá que una columna de una clave foránea de varias columnas sea nula a menos que todas las columnas de la clave foránea sean nulas; si todos son nulos, no se requiere que la fila tenga una coincidencia en la tabla a la que se hace referencia. MATCH SIMPLE permite que cualquiera de las columnas de clave foránea sea nula; si alguno de ellos es nulo, no se requiere que la fila tenga una coincidencia en la tabla a la que se hace referencia. MATCH PARTIAL aún no está implementado. (Por supuesto, las restricciones NOT NULL se pueden aplicar a la(s) columna(s) de referencia para evitar que surjan estos casos).
Creo que actualmente se ve como una antifunción, por lo que no es probable que llegue pronto.
Como solución alternativa, puede crear otra tabla que solo tenga (a,b)
CREATE TABLE baz ( a int, b int, PRIMARY KEY (a,b) );Desde aquí puede vincular ambas tablas a él...
CREATE TABLE foo ( a int, b int, c int, PRIMARY KEY (a,b,c), FOREIGN KEY (a,b) REFERENCES baz ); CREATE TABLE bar ( a int, b int, FOREIGN KEY (a,b) REFERENCES baz );