2012-01-12 27 views
31

¿Sería posible en SQL Server 2008 tener una tabla creada con 2 columnas que son al mismo tiempo claves primarias y externas? En caso afirmativo, ¿cómo se vería ese código? He buscado y no encontré nada.Clave primaria y externa al mismo tiempo

+0

¿Quiere decir cómo sería el SQL para crear la tabla? –

+3

Este es un caso muy común en los marcos ORM que soportan mapeo de herencia haciendo mapeo de tabla por clase. Por ejemplo, si una clase B hereda de una clase A y se mapean a table_a y table_b, es común que las instancias de B tengan el mismo id en table_a y table_b, y table_b define un FK en su columna id en la table_a columna de id. Intente definir el FK y el PK utilizando SQLServer Management Studio. –

Respuesta

47

Claro, no hay problema:

CREATE TABLE dbo.[User] 
(
    Id int NOT NULL IDENTITY PRIMARY KEY, 
    Name nvarchar(1024) NOT NULL 
); 

CREATE TABLE [Group] 
(
    Id int NOT NULL IDENTITY PRIMARY KEY, 
    Name nvarchar(1024) NOT NULL 
); 

CREATE TABLE [UserToGroup] 
(
    UserId int NOT NULL, 
    GroupId int NOT NULL, 
    PRIMARY KEY CLUSTERED (UserId, GroupId), 
    FOREIGN KEY (UserId) REFERENCES [User] (Id) ON UPDATE NO ACTION ON DELETE CASCADE, 
    FOREIGN KEY (GroupId) REFERENCES [Group] (Id) ON UPDATE NO ACTION ON DELETE CASCADE 
); 

Esto se usa muy comúnmente para modelar muchos-a-muchos de relaciones.

+0

Al igual que un FYI, en 'information_schema.key_column_usage' para la tabla' UserToGroup', tanto 'UserID' como' GroupID 'devolverán dos filas cada una ... una para PK, una para FK ... [en referencia a ...] (http://stackoverflow.com/a/15622288/623952) –

7

Estas construcciones son totalmente diferentes.

A La clave principal se utiliza para imponer la exclusividad dentro de una tabla y ser un identificador único para un determinado registro.

A La clave externa se utiliza para integridad referencial, para asegurarse de que exista un valor en otra tabla.

La clave externa necesita hacer referencia a la clave primaria en otra tabla.

Si desea tener una clave externa que también sea única, puede hacer una restricción FK y agregar un índice/restricción único al mismo campo.

Como referencia, SQL Server permite que un FK haga referencia a un UNIQUE CONSTRAINT, así como a un campo PRIMARY KEY.

1

Sólo una nota rápida - de las páginas de Microsoft (http://msdn.microsoft.com/en-us/library/ms189049.aspx) ...

"Una restricción de clave externa no tiene que estar vinculado únicamente a una restricción de clave primaria en otra tabla, sino que también se puede definir para hacer referencia las columnas de una restricción ÚNICA en otra tabla ".

No se usa con frecuencia, pero es útil en algunas circunstancias.

3

Probablemente no sea una buena idea ya que a menudo quiere permitir la duplicación de claves foráneas en la tabla. Incluso si no lo hace ahora, en el futuro, podría, así que mejor no hacer esto. Consulte Is it fine to have foreign key as primary key?

+1

¿Por qué no? Al igual que el enlace que has puesto, dice que hay casos como relación de 1 a 1 en los que puede ser necesario –

+0

No dije que SIEMPRE es una mala idea;) Tienes razón, puede haber excepciones donde lo hará siempre sea un 1: 1. Mi comentario está aquí para hacer que las personas piensen en la opción correcta para ellos. – thebiggestlebowski

Cuestiones relacionadas