Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

496
Views
PostgreSQL: tabla que hace referencia solo a una parte de una clave principal compuesta

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.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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 );
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!