2010-05-24 13 views
35

Está escrito en cada libro que las claves externas son en realidad claves principales en alguna otra tabla pero podemos tener una clave externa que no es clave primaria en ninguna otra tabla¿podemos tener una clave externa que no sea la clave principal en ninguna otra tabla?

+0

¿Por qué le gustaría? – JeffO

+0

no hay una razón específica para que alguien me pregunte esto y me confundí por eso solo quería saber que es eso – Mac

+0

¿Por qué? Bueno, eso depende de cuáles sean tus razones para elegir una clave primaria: formalmente hablando, no hay una razón absoluta para elegir una clave principal sobre otra, por lo que no hay motivos particulares para decir por qué sería o no la misma. uno usado para referencias de claves extranjeras. Además, es potencialmente deseable en algunos casos utilizar más de una clave candidata por tabla como referencia de clave externa. En ese caso, una de esas referencias obviamente no es la clave principal, a menos que quiera llamar a más de una tecla la "primaria". – sqlvogel

Respuesta

40

Sí, puede tener una clave externa que haga referencia a índice único en otra tabla.

CREATE UNIQUE INDEX UX01_YourTable ON dbo.YourTable(SomeUniqueColumn) 

ALTER TABLE dbo.YourChildTable 
    ADD CONSTRAINT FK_ChildTable_Table 
    FOREIGN KEY(YourFKColumn) REFERENCES dbo.YourTable(SomeUniqueColumn) 
+5

Esto es correcto en Microsoft SQL Server pero no es stanard SQL y no es compatible con todos los demás DBMS. En el estándar ISO SQL, no existe un índice y siempre se requieren restricciones FOREIGN KEY para hacer coincidir las restricciones UNIQUE o PRIMARY KEY. Personalmente, siempre preferiría usar restricciones únicas en lugar de índices únicos sin restricción. Creo que una restricción hace que el significado deseado sea más claro y la sintaxis de restricción es más probable que otro desarrollador de bases de datos lo entienda. – sqlvogel

+4

@David: sí, pero el OP preguntaba por SQL Server ..... –

13

Por definición, una clave foránea debe hacer referencia a una clave candidata de alguna tabla. No necesariamente tiene que ser la clave principal.

Como una cuestión de detalles, la restricción llamada FOREIGN KEY en SQL no es exactamente equivalente a la definición del libro de texto de una clave foránea en el modelo relacional. Restricción FOREIGN KEY de SQL es diferente porque:

  • se puede hacer referencia a cualquier conjunto de columnas sujetas a una restricción de unicidad, incluso si no son claves candidatas (superclaves o columnas anulables por ejemplo).
  • puede incluir valores nulos, en cuyo caso la restricción no se aplica
  • su sintaxis depende de orden de las columnas, por lo que una restricción fk en (A, B) referencia (A, B) es diferente a una restricción en (B , A) referencia (A, B).
+0

APC no está seguro de por qué quiere editar esto para reemplazar "SQL" por "SQL Server". Mis comentarios se aplican a SQL (es decir, el lenguaje estándar definido por ISO). Se aplican a todas las implementaciones de SQL con las que estoy familiarizado, no solo SQL Server. – sqlvogel

+0

Sí, ¿qué pasa con estas personas que editan publicaciones sin saber lo que están haciendo? Voto por no permitir ediciones en Respuestas. – PerformanceDBA

3

Sí, puede haber una clave externa que es clave única en otra tabla, ya que la clave única es un subconjunto de la clave principal pero no la clave primaria exacta.

De modo que es posible que la clave externa sea clave única en otra tabla.

0

Respuesta estándar general es no. Solo es posible si la clave externa se refiere a cualquier columna de forma única en otra tabla. Eso significa que la clave externa debe ser la clave candidata en otra tabla y la clave primaria también es una clave candidata en la tabla.

Cuestiones relacionadas