Cómo crear una clave primaria compuesta en SQL Server 2008

178

Quiero crear tablas en SQL Server 2008, pero no sé cómo crear una clave primaria compuesta. ¿Cómo puedo conseguir esto?

Ganesamoorthy
fuente
1
Como nuevo en asp.net, un consejo: las claves primarias compuestas son algo malo que generalmente indican un diseño mal pensado
smirkingman
47
@smirkingman Se pueden resolver problemas muy importantes, a menudo casi exclusivamente con claves primarias compuestas. Como cuando tiene cientos / miles de usuarios que guardan filas en un solo tipo de tabla / entidad. Desea que las filas estén ordenadas por ID de usuario, más un segundo valor. Su juicio de valor es simplemente incorrecto, de lo contrario, estaríamos desaprobando esta característica pronto.
Nicholas Petersen
2
Posible duplicado de Crear clave primaria compuesta en SQL Server
Arun Prasad ES

Respuestas:

243
create table my_table (
     column_a integer not null,
     column_b integer not null,
     column_c varchar(50),
     primary key (column_a, column_b)
);
Thilo
fuente
2
¿Cuál es la diferencia entre usar Clave primaria y CONSTRAINT como en el ejemplo de @ matthew-abbott?
mateuscb
28
Crea una restricción con nombre que se puede eliminar / actualizar por nombre
longhairedsi
14
No del todo cierto. Ambos crean "restricciones con nombre". Es solo que con el primero, no controlas el nombre. Pero una vez creado, puede buscar el nombre que se utilizó y eliminar / actualizar por nombre ...
Auspex
170
CREATE TABLE UserGroup
(
  [User_Id] INT NOT NULL,
  [Group_Id] INT NOT NULL

  CONSTRAINT PK_UserGroup PRIMARY KEY NONCLUSTERED ([User_Id], [Group_Id])
)
Matthew Abbott
fuente
34
+1: Sí, asigne un nombre a sus restricciones, de lo contrario, Sql Server hace cosas desagradables como nombrarlos PK_UserGrou_5DEAEAF5 en el DB de una versión y PK_UserGrou_3214EC0777F66C69 en otro. Esto es una molestia si necesita actualizar o descartar el PK, ya que primero debe obtener el nombre de la base de datos y luego usar sql dinámico (o construir primero el comando en el código). Además, es feo.
Monty
2
¿Hay alguna razón por la que no quisiera que mi PK se agrupe?
4AM
1
@ 4AM Esto puede responder a su pregunta: enlace
Dongminator
52

Vía Enterprise Manager (SSMS) ...

  • Haga clic derecho en la tabla en la que desea crear la clave compuesta y seleccione Diseño .
  • Resalte las columnas que desea formar como clave compuesta
  • Haga clic derecho sobre esas columnas y establezca la clave primaria

Para ver el SQL a continuación, puede hacer clic derecho en la Table> Script Table As>Create To

kevchadders
fuente
2
Gracias. Esta es la forma más segura / fácil sin potencialmente estropear mi sintaxis SQL
AlbatrossCafe
1
Esto facilita a aquellos que desean la solución rápida a través de la interfaz de diseño / guid. Gracias por la ayuda.
Trevor Nestman
32

Sé que llego tarde a esta fiesta, pero para una mesa existente, intente:

ALTER table TABLE_NAME
ADD CONSTRAINT [name of your PK, e.g. PK_TableName] PRIMARY KEY CLUSTERED (column1, column2, etc.)
Ray K.
fuente
27

Para el servidor MSSQL 2012

CREATE TABLE usrgroup(
  usr_id int FOREIGN KEY REFERENCES users(id),
  grp_id int FOREIGN KEY REFERENCES groups(id),

  PRIMARY KEY (usr_id, grp_id)
)

ACTUALIZAR

Debo agregar!

Si desea agregar la modificación de claves externas / primarias, primero debe crear las claves con restricciones o no puede realizar cambios. Como este a continuación:

CREATE TABLE usrgroup(
  usr_id int,
  grp_id int,

  CONSTRAINT FK_usrgroup_usrid FOREIGN KEY (usr_id) REFERENCES users(id),
  CONSTRAINT FK_usrgroup_groupid FOREIGN KEY (grp_id) REFERENCES groups(id),

  CONSTRAINT PK_usrgroup PRIMARY KEY (usr_id,grp_id)
)

En realidad, la última forma es más saludable y serial. Puede buscar los nombres de restricciones FK / PK (dbo.dbname> Keys> ..) pero si no usa una restricción, MSSQL crea automáticamente nombres FK / PK aleatorios. Tendrá que ver cada cambio (alterar tabla) que necesita.

Le recomiendo que establezca un estándar para usted; la restricción debe definirse de acuerdo con su estándar. No tendrá que memorizar y no tendrá que pensar demasiado. En resumen, trabajas más rápido.

Fatih Mert Doğancan
fuente
esto no crea PK pero solo FK, ¿no?
batmaci
@batmaci; No, es a la vez FK y doble grupo FK para PK. Ese uso es más saludable. Lo aconsejo Cuando no creas PK, también puedes usarlo.
Fatih Mert Doğancan
1

Primero cree la base de datos y la tabla, agregando manualmente las columnas. En qué columna ser clave principal. Debe hacer clic con el botón derecho en esta columna y establecer la clave primaria y establecer el valor de inicialización de la clave primaria.

Sakthi Thanuskodi
fuente
-3

Para crear una clave única compuesta en la tabla

ALTER TABLE [TableName] ADD UNIQUE ([Column1], [Column2], [column3]);
Abhishek Jaiswal
fuente
-3
CREATE TABLE UserGroup
(
  [User_Id] INT Foreign Key,
  [Group_Id] INT foreign key,

 PRIMARY KEY ([User_Id], [Group_Id])
)
FahadHussain
fuente
2
agregue alguna descripción también
Abdulla Nilam