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

178

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

Ganesamoorthy
источник
1
Поскольку вы новичок в asp.net, совет: составные первичные ключи - это плохая вещь, которая обычно указывает на плохо продуманный дизайн
ухмылка
47
@smirkingman Очень важные проблемы могут быть решены, часто почти исключительно с помощью составных первичных ключей. Например, когда у вас есть сотни / тысячи пользователей, которые сохраняют строки в один тип таблицы / сущности. Вы хотите, чтобы строки были упорядочены по идентификатору пользователя, а затем второе значение. Ваше оценочное суждение просто неверно, в противном случае мы бы устарели в ближайшее время.
Николас Петерсен
2
Возможный дубликат создания составного первичного ключа в SQL Server
Арун Прасад Е.С.

Ответы:

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

kevchadders
источник
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

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

Шакти Танускоди
источник
-3

Создать составной уникальный ключ на столе

ALTER TABLE [TableName] ADD UNIQUE ([Column1], [Column2], [column3]);
Абхишек Джайсвал
источник
-3
CREATE TABLE UserGroup
(
  [User_Id] INT Foreign Key,
  [Group_Id] INT foreign key,

 PRIMARY KEY ([User_Id], [Group_Id])
)
FahadHussain
источник
2
добавить описание тоже
Абдулла Нилам