Hay algunas buenas respuestas aquí, pero me gustaría ir un paso más allá - en aras de la posteridad.
Una clave foránea tiene que hacer referencia a Primary key
(Unique, Clustered Index) o Unique
column en otra tabla. Básicamente, el componente necesario es la restricción Unique
. Añadiría que puede tener columnas anulables en su clave foránea, PERO si permite nulos en una clave "compuesta", SQL omite la verificación de los datos en la relación de clave foránea. Este es un punto importante para recordar ya que la razón principal por la que la mayoría de nosotros usamos claves externas es para garantizar la integridad de los datos en nuestras bases de datos.
Como nota final, me gusta declarar explícitamente todos mis nombres de clave. ¿Por qué? ¿Podrías preguntar? Si necesita usar "Indización de texto completo" en el futuro para obtener mejores capacidades de búsqueda, al no hacerlo, se le obliga a hacer referencia a todos los nombres "autogenerados" de las claves. Esto puede no ser un gran problema para proyectos pequeños que no requieren transformación de datos o actualizaciones de índice de texto completo programadas, pero si está creando una secuencia de comandos de esta funcionalidad podría dificultar su trabajo (por ejemplo, tener que buscar el nombre real de su Primaria Nombre predeterminado de la clave: pk_someTable_1248594832828495904
).
Esto es lo que yo haría en escribir el código SQL para evitar cualquier escollo futuras:
- no permiten valores NULL en claves externas compuestas si es posible.
- Claves de nombre que utilizan explícitamente una convención de nomenclatura convenida (por ejemplo,
PK_Schema/56_TalbeName_Col1_Col2
). Esto no solo le proporciona un nombre estándar para la clave, sino que también puede ver fácilmente en el índice a qué columnas se hace referencia y en qué orden.
El Código:
CREATE TABLE MySchema.PrimaryTable (
Key1 varchar(20) NOT NULL,
Key2 date NOT NULL,
CONSTRAINT PK_MySchema_PrimaryTable_Key1_Key2 PRIMARY KEY (Key1, Key2)
)
GO
CREATE TABLE MySchema.SecondaryTable (
AutoID int IDENTITY,
Key1 varchar(20) NOT NULL,
Key2 date NOT NULL,
CONSTRAINT FK_MySchema_SecondaryTable_Key1_Key2
FOREIGN KEY (Key1, Key2) REFERENCES PrimaryTable (Key1, Key2)
)
GO
OptillectTeam es básicamente muerto en con su respuesta. Solo quería aclarar algunas cosas importantes que no se habían mencionado antes. Hay una buena referencia en MSDN sight sobre esto y más sobre claves foráneas: Foreign Key Constraint.
Botón1 y Key2 en la tabla principal no son una clave compuesta primaria (o una restricción única) – gbn
Botón1 y Key2 en la tabla principal se configuran como el compuesto Clave primaria. – Danielle
¿Cómo está intentando configurar la restricción exactamente? – JNK