2010-10-13 2206 views
120

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

+1

Como eres nuevo en asp.net, un consejo: las claves primarias compuestas son * algo malo * que generalmente indican un diseño poco pensado – smirkingman

+31

@smirkingman Se pueden resolver problemas muy importantes, a menudo casi exclusivamente con teclas primarias compuestas. Por ejemplo, cuando tiene cientos/miles de usuarios que guardan filas en una sola tabla/tipo de entidad. Desea las filas 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. –

+1

Posible duplicado de [Creación de clave primaria compuesta en SQL Server] (http://stackoverflow.com/questions/12594791/creating-composite-primary-key-in-sql-server) –

Respuesta

185
create table my_table (
    column_a integer not null, 
    column_b integer not null, 
    column_c varchar(50), 
    primary key (column_a, column_b) 
); 
+1

¿Cuál es la diferencia entre el uso de ** Primary Clave ** y ** RESTRICCIÓN ** como en el ejemplo de @ matthew-abbott? – mateuscb

+24

Crea una restricción con nombre que se puede eliminar/actualizar por nombre – longhairedsi

+3

No del todo cierto. Ambos crean "restricciones nombradas". Es solo que con el primero, no controlas el nombramiento. Pero una vez creado, puede buscar el nombre que se usó y eliminar/actualizar por nombre ... – Auspex

134
CREATE TABLE UserGroup 
(
    [User_Id] INT NOT NULL, 
    [Group_Id] INT NOT NULL 

    CONSTRAINT PK_UserGroup PRIMARY KEY NONCLUSTERED ([User_Id], [Group_Id]) 
) 
+23

+1 - Sí, nombre a sus restricciones personas, sino Sql Server hace cosas desagradables como nombres PK_UserGrou_5DEAEAF5 en DB de una versión y PK_UserGrou_3214EC0777F66C69 en otro. Esto es un problema si necesita actualizar o descartar el PK, ya que primero tiene que obtener el nombre del DB y luego usar el SQL dinámico (o construir el comando en el código primero). Además, es feo. – monty

+0

¿Hay alguna razón por la que no quisiera que mi PK se agrupe? – 4AM

+0

@ 4AM Esto puede responder a su pregunta: [enlace] (https://dba.stackexchange.com/questions/7741/when-should-a-primary-key-be-declared-non-clustered) – Dongminator

37

Via Enterprise Manager (SSMS) ...

  • haga clic derecho en la tabla que desea crear la clave compuesta y seleccione Diseño.
  • Resalte las columnas que desean formar como un compuesto clave
  • Haga clic derecho sobre esas columnas y Establecer clave principal

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

+1

Gracias. Esta es la forma más segura/más fácil sin dañar potencialmente mi sintaxis SQL – AlbatrossCafe

+1

Esto lo hace fácil para aquellos que quieren la solución rápida a través de la interfaz de diseño/guía. Gracias por la ayuda. –

1

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

-3

Para crear una clave única compuesta en la mesa

ALTER TABLE [TableName] ADD UNIQUE ([Column1], [Column2], [column3]); 
+4

¡Una tecla ÚNICA NO es lo mismo que una tecla PRIMARIA! –

9

Sé que llego tarde a la fiesta, pero para una tabla existente, trato:

ALTER table TABLE_NAME 
ADD CONSTRAINT [name of your PK, e.g. PK_TableName] PRIMARY KEY CLUSTERED (column1, column2, etc.) 
-1
CREATE TABLE UserGroup 
(
    [User_Id] INT Foreign Key, 
    [Group_Id] INT foreign key, 

PRIMARY KEY ([User_Id], [Group_Id]) 
) 
+1

agregue alguna descripción también –

+4

6 años tarde y la sintaxis no es correcta! –

9

Para 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) 
) 

ACTUALIZACIÓN

Debo añadirlo!

Si desea alterar estas claves externas/principales, primero debe crearlas con restricción o no puede realizar cambios. Me gusta esto 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 manera es más saludable y serial. Puede buscar los nombres de Restricción de FK/PK (dbo.dbname> Keys> ..) pero si no usa restricción, MSSQL crea automáticamente nombres FK/PK aleatorios. Tendrá que ver cada cambio (modificar la tabla) que necesita.

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

+0

esto no crea PK pero solo FK, ¿no? – batmaci

+0

@batmaci; No, es tanto FK como el grupo FK doble para PK. Ese uso es más saludable. Yo lo aconsejo Cuando no crea PK, puede usar también. –

Cuestiones relacionadas