2012-05-31 3 views
2

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

У меня есть пара вопросов:

Подключение Table A и Table B внешним ключом, где я создаю ключ в Table A или B?

Допустим, у меня есть таблица Users и Ranks с отношением 1: 1.

Users стол:

CREATE TABLE [dbo].[Users](
    [ID] [bigint] IDENTITY(1,1) NOT NULL, 
    [Email] [nvarchar](89) NOT NULL, 
    [Name] [nvarchar](25) NOT NULL, 
    [Midname] [nvarchar](25) NOT NULL, 
    [Surname] [nvarchar](25) NOT NULL, 
    [Phone] [varchar](15) NOT NULL, 
    [Country] [smallint] NOT NULL, 
    [Manager] [nvarchar](89) NOT NULL, 
    [Referrer] [nvarchar](89) NOT NULL, 
    [Rank] [tinyint] NOT NULL, 
     CONSTRAINT [PK_UsersID] PRIMARY KEY CLUSTERED 
     ([Email] ASC) 
    ) 

Ranks стол:

CREATE TABLE [dbo].[Ranks](
    [ID] [tinyint] IDENTITY(1,1) NOT NULL, 
    [Rank] [nvarchar](50) NOT NULL, 
     CONSTRAINT [PK_Rank] PRIMARY KEY CLUSTERED 
     ([ID] ASC) 
    ) 

Я хочу присоединиться к ним по:

Users.Rank ON Rank.ID 

Но это не позволяет мне создать ключ, Я получаю такую ​​ошибку:

Microsoft SQL Server Management Studio

The columns in table 'Users' do not match an existing primary key or UNIQUE constraint.

Почему это говорит мне о ЛЮБОЙ первичный ключ? Я не трогаю основной, я работаю с внешними ключами, я не понимаю, почему PK и FK связаны.

Не могли бы вы объяснить, что я делаю неправильно?

Спасибо!

+0

Причина получения этой ошибки: столбец «Столбец» в таблице «Пользователь», на которую вы пытаетесь ссылаться, не имеет на нем уникального или первичного ключа. – praveen

+0

@marc_s, но я не могу делать Users.Rank как PK. Как мне тогда проектировать мои таблицы? Это нормально, если я не собираюсь связывать их с FK? –

+1

Отвечает ли KM. Для вас? Создать FK из 'Users.Rank' ->' Rank.ID'? Я неправильно понял/неверно истолковал ваш вопрос –

ответ

1

Пользователи.Rank ON Rank.ID это правильно, но если Users.Rank является int, Rank.ID должен быть int или он будет генерировать ошибки.

Первичный ключ для лиц - это, например, персональный идентификатор или адрес электронной почты, или имя + имя + возраст или другое другое ..., но в базах данных этот идентификатор - часто целочисленный тип. если у вас есть человек таблицы, вы должны иметь столбцы PersonID, имя, фамилия, ...,

при использовании, что PersonId в другой таблице он становится внешним ключом. напр. если у вас есть PhoneNumber стол вы WIIL есть эти колонки

numberid, префикс, номер и PersonId - теперь это PersonID является FK.FK тип = тип PK

вы можете сделать это в схеме базы данных просто: первое сопротивление вручную поля первичного ключа для внешнего ключа таблицы: drag by hand primary key field to the foreign key table чем

, чем смотреть на диалоге и нажмите кнопку ОК :) enthan look at the dialog and click ok :)e

+0

не являются пользователями. Rank и Rank.ID оба tinyints? –

3

Я могу создать внешний ключ с помощью этого:

ALTER TABLE dbo.Users ADD CONSTRAINT 
    FK_Users_Ranks FOREIGN KEY 
    (
    Rank 
    ) REFERENCES dbo.Ranks 
    (
    ID 
    ) 

присоединиться к ним как:

select 
    * 
    from Users   u 
     INNER JOIN Ranks r ON u.rank=r.id 

Я рекомендую извлекать IDENTITY(1,1) из Ranks.ID. С таким количеством значений (tinyint) лучше всего управлять идентификаторами. Вы можете вставлять ранги с идентификаторами 10, 20, 30, 40. В дальнейшем, если вам нужно, вы можете добавить 15, если вам нужно добавить новую цифру от 10 до 20. С личностью вы заперты.

Убедитесь, что если у вас есть данные в ваших таблицах и попробуйте добавить FK, все значения Users.Rank существуют в Rank.ID перед добавлением FK.

+0

KM, я могу подключить 'Users.Rank' ->' Rank.ID', но каскад DELETE не работает. Я думал, что ключ должен быть установлен напротив: 'Rank.ID' ->' Users.Rank'. Есть идеи? –

+0

** зачем вы каскадируете удалять пользователей и ряды? ** Вы когда-нибудь захотите удалить ранг и удалить всех этих пользователей?или вы когда-нибудь захотите удалить пользователя и удалить этот ранг? –

+0

Я не хочу, чтобы каскадные ряды удаляли пользователя, просто думая о будущем. Если я не хочу его каскадировать, то какая точка связывает таблицы FK, такие как 'User.ID' ->' Rank.ID' –

0

Вы создаете внешний ключ в «правильном направлении»? На основании сообщения об ошибке я рискну предположить, что вы пытаетесь создать отношения, где вы:

  • Выбор первичного ключ таблицу, чтобы быть пользователями, столбец будет Ранг
  • Выберите внешний ключ таблицы будет место , столбец будет ID

Это означает, что «ключ» User.Rank будет экспортирован в таблицу рангов, что невозможно, поскольку столбцы Users.Rank не являются ключом для таблицы Users.

Внешний ключ должен быть в другом направлении:

  • Первичный ключ таблицы является место, колонка ID
  • внешнего ключа таблицы пользователя, coulmn Ранг

Это создаст один -to-many, где в рядах Users таблицы могут быть одинаковые ряды. Если вы действительно хотите иметь отношения «один к одному», вам нужно будет создать уникальный индекс (или ограничение) в столбце Users.Rank.

Смежные вопросы