Вопрос

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

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

Идентификатор вашего пользователя и идентификатор друга

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

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

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

Дэйв :Грег

Дэйв :Крис

Грег :Крис

Крис :Грег

это хорошо

Дэйв :Грег

Дэйв :Грег

это нехорошо.

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

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

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

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

ВСТАВИТЬ В [friendRequests] ([userId], [FriendUserId]) ЗНАЧЕНИЯ ('"+userId +"', '"+PossibleFriend+"') ТАМ, ГДЕ ИХ НЕТ (ВЫБЕРИТЕ [userId], [FriendUserId] ИЗ [friendRequests])

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

FriendRelationshipId (ПЕРВИЧНЫЙ КЛЮЧ) Идентификатор пользовательа_1 (ОГРАНИЧЕНИЕ ВНЕШНЕГО КЛЮЧА) Идентификатор пользовательа_2 (ОГРАНИЧЕНИЕ ВНЕШНЕГО КЛЮЧА)

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

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

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

ВЫБЕРИТЕ dbo.fn_GetFriendUserIdForUserId(UserId_1) В КАЧЕСТВЕ 'Friend1', dbo.fn_GetFriendUserIdForUserId(UserId_2) КАК 'Friend2', ИЗ FriendRelationshipId

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top