Уникальная запись в Asp.Net SQL - PullRequest
1 голос
/ 02 апреля 2009

Я задавал этот вопрос ранее, но ответы были не те, что я искал.

Я создал таблицу в Asp.net без использования кода. Содержит две колонки.

YourUserId и FriendUserId

Это отношения многие ко многим.

Вот что я хочу:

Может быть несколько записей с вашим именем в качестве UserId, также может быть несколько записей с одинаковым FriendUserId ... но не может быть несколько записей с одинаковыми обеими. Например:

Дэйв: Грег

Дейв: Крис

Грег: Крис

Крис: Грег

это хорошо

Дэйв: Грег

Дэйв: Грег

не хорошо.

Я щелкнул правой кнопкой мыши по столу и выбрал Индексы / Ключи. Затем я поместил оба столбца в раздел столбцов и решил сделать их уникальными. Я думал, что это сделает их уникальными в целом, но индивидуально не уникальными.

Если вы перейдете к набору данных, он показывает ключи рядом с обоими столбцами и говорит о наличии ограничения с проверкой обоих столбцов.

Есть ли способ просто убедиться, что вы не вставляете дубликат копии записи в таблицу, если отдельные столбцы не являются уникальными?

Я пытался управлять им с помощью оператора SQL, но это не сработало. Это то, что я пытался.

INSERT INTO [FriendRequests] ([UserId], [FriendUserId]) VALUES ('' + UserId + "','" + возможный идентификатор + "'), ГДЕ НЕ СУЩЕСТВУЕТ (ВЫБРАТЬ [UserId], [FriendUserId] ИЗ [FriendRequests])

По какой-то причине это не сработало. Спасибо за вашу помощь!

Ответы [ 3 ]

3 голосов
/ 02 апреля 2009

Вы должны создать составной первичный ключ, чтобы предотвратить дублирование строк.

ALTER TABLE FriendRequests
ADD CONSTRAINT pk_FriendRequests PRIMARY KEY (UserID, FriendUserID)

Или выберите оба столбца в конструкторе таблиц и щелкните правой кнопкой мыши, чтобы установить его в качестве ключа.

Чтобы предотвратить дружбу, вы должны создать ограничение CHECK:

ALTER TABLE FriendRequests
ADD CONSTRAINT ck_FriendRequests_NoSelfFriends CHECK (UserID <> FriendUserID)

Вы можете добавить проверочное ограничение в конструкторе, щелкнув правой кнопкой мыши в любом месте дизайнера таблицы, выбрав «Проверить ограничения», нажав «Добавить» и установив выражение в UserID <> FriendUserID

Возможно, вы захотите посмотреть на этот вопрос

1 голос
/ 02 апреля 2009

Похоже, вам нужен составной ключ, чтобы оба поля стали одним ключом.

0 голосов
/ 02 апреля 2009

У меня есть идея получше. Создать новую таблицу. Называется FriendRequestRelationships. Иметь следующие столбцы

FriendRelationshipId (ПЕРВИЧНЫЙ КЛЮЧ) UserId_1 (FOREIGN KEY CONSTRAINT) UserId_2 (FOREIGN KEY CONSTRAINT)

Установите уникальное ограничение, чтобы разрешить только одну связь с UserId_1 и UserId_2. Эта таблица теперь служит вашим жгутом "многие ко многим".

Создайте скалярную функцию, которая может возвращать FriendUserId для UserId, скажем, она называется fn_GetFriendUserIdForUserId

Теперь вы можете отобразить ваши отношения, выполнив следующий запрос

SELECT dbo.fn_GetFriendUserIdForUserId (UserId_1) AS 'Friend1', dbo.fn_GetFriendUserIdForUserId (UserId_2) AS 'Friend2', FROM FriendRelationshipId

...