Уникальная запись в Asp.Net SQL
Вопрос
Я задавал этот вопрос ранее, но ответы были не теми, что я искал.
Я создал таблицу в 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