Как создать составной первичный ключ в SQL Server 2008


178

Я хочу создавать таблицы в SQL Server 2008, но я не знаю, как создать составной первичный ключ. Как мне этого добиться?


1
Поскольку вы новичок в asp.net, совет: составные первичные ключи - это плохая вещь, которая обычно указывает на плохо продуманный дизайн
ухмылка

47
@smirkingman Очень важные проблемы могут быть решены, часто почти исключительно с помощью составных первичных ключей. Например, когда у вас есть сотни / тысячи пользователей, которые сохраняют строки в один тип таблицы / сущности. Вы хотите, чтобы строки были упорядочены по идентификатору пользователя, а затем второе значение. Ваше оценочное суждение просто неверно, в противном случае мы бы устарели в ближайшее время.
Николас Петерсен

Ответы:


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

2
В чем разница между использованием Primary Key и CONSTRAINT, как в примере с @ matthew-abbott?
mateuscb

28
Он создает именованное ограничение, которое может быть удалено / обновлено по имени
longhairedsi

14
Не совсем верно. Оба создают «именованные ограничения». Просто с первым вы не контролируете именование. Но после создания вы можете найти имя, которое было использовано, и удалить / обновить по имени ...
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])
)

34
+1 - Да, назовите своих людей с ограничениями, иначе Sql Server делает такие неприятные вещи, как присвоение им имен PK_UserGrou_5DEAEAF5 в БД одного выпуска и PK_UserGrou_3214EC0777F66C69 в другом. Это неприятно, если вам нужно обновить или удалить PK, так как вы должны сначала получить имя из базы данных, а затем использовать динамический sql (или сначала создать команду в коде). Кроме того, это ужасно.
Монти

2
Есть ли причина, по которой я бы не хотел, чтобы мой ПК был кластеризован?
4 утра

1
@ 4 утра Это может ответить на ваш вопрос: ссылка
Dongminator

52

Через Enterprise Manager (SSMS) ...

  • Щелкните правой кнопкой мыши таблицу, на которой вы хотите создать составной ключ, и выберите « Дизайн» .
  • Выделите столбцы, которые вы хотите сформировать как составной ключ
  • Щелкните правой кнопкой мыши по этим столбцам и установите первичный ключ.

Для того, чтобы увидеть SQL вы можете правой кнопкой мыши на Table> Script Table As>Create To


2
Спасибо. Это самый безопасный / самый простой способ без потенциальной путаницы с моим синтаксисом SQL
AlbatrossCafe

1
Это облегчает работу тех, кто хочет быстро исправить это через интерфейс design / guid. Спасибо за помощь.
Тревор Нестман

32

Я знаю, что опоздал на эту вечеринку, но для существующего стола, попробуйте:

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

27

Для MSSQL Server 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)
)

ОБНОВИТЬ

Я должен добавить!

Если вы хотите добавить изменение внешних / первичных ключей, сначала вы должны создать ключи с ограничениями, иначе вы не сможете вносить изменения. Как это ниже:

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

На самом деле последний путь является более здоровым и последовательным. Вы можете посмотреть имена ограничений FK / PK (dbo.dbname> Keys> ..), но если вы не используете ограничение, MSSQL автоматически создает случайные имена FK / PK. Вам нужно будет просмотреть каждое изменение (таблица изменений), которое вам нужно.

Я рекомендую вам установить стандарт для себя; ограничение должно быть определено в соответствии с вашим стандартом. Вам не придется запоминать, и вам не придется слишком долго думать. Короче, ты работаешь быстрее.


это не создает PK, а только FK, не?
batmaci

@batmaci; Нет, это и FK, и двойная группа FK для PK. Это использование полезнее. Я советую это. Когда вы не создаете PK, вы также можете использовать.
Фатих Мерт Доганкан

1

Сначала создайте базу данных и таблицу, вручную добавив столбцы. В каком столбце должен быть первичный ключ. Вы должны щелкнуть правой кнопкой мыши по этому столбцу и установить первичный ключ и установить начальное значение первичного ключа.



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.