SQL - Таблица переноса (?) Уникальных данных - PullRequest
0 голосов
/ 01 июля 2018

Я очень зеленый в области SQL, поэтому я не знаю, как на самом деле называется идея или тип, но я назову их «Перенос таблиц», и я попытаюсь объяснить, что я имею в виду и мою проблему. Пожалуйста, поправьте меня!

Описание

3 таблицы.

Контакты: ID (первичный ключ), Имя, Фамилия, SSN и т. Д.

Адрес: ID (первичный ключ), город, улица и т. Д.

ContactsTransferAddress (сокращение: CTA) : ID (первичный ключ), ContactID (внешний ключ), AddressID (внешний ключ)

Проблема

Теперь это всего лишь упражнение ... Пока я сделал хранимую процедуру, которая:

ALTER PROCEDURE [dbo].[AddAddress] 
    @Street varchar(MAX),
    @City varchar(MAX),
    @CID int, --ContactID
    @AID int OUTPUT --AddressID
AS
BEGIN
    INSERT INTO Addressess(Street,City) VALUES (@Street, @City)
    SET @AID = SCOPE_IDENTITY()
    INSERT INTO CTA(CID,AID) VALUES (@CID, @AID)
END

Есть ли способ сделать так, чтобы 2 человека использовали один и тот же AddressID (AID) при помещении данных соединения в CTA? Прямо сейчас я получаю, что мой SP выше даст разные идентификаторы для каждого адреса. Но я не знаю, как получить уникальные адреса.

Спасибо!

1 Ответ

0 голосов
/ 01 июля 2018

Сначала определите таблицу Addresses, чтобы дубликаты не допускались:

alter table Addresses add constraint unq_Addresses_City_Street
    unique (City, Street);

Тогда вы должны что-то делать с дубликатами, потому что ваш код не будет работать.

Поскольку вы учитесь, я собираюсь предложить метод проверки и вставки:

SELECT @AID = AddressId
FROM Addresses
WHERE Street = @Street and City = @City;

IF @Aid IS NULL
BEGIN
    INSERT INTO Addresses(Street, City)
        VALUES (@Street, @City);

    SET @AID = SCOPE_IDENTITY();
END;

INSERT INTO CTA (CID, AID)
    VALUES (@CID, @AID);

В более серьезном коде я бы принял другие меры предосторожности. В частности:

  • Я бы использовал транзакции и блокировки для предотвращения проблем в многопоточной среде.
  • Я бы использовал предложение OUTPUT для возврата вставленных идентификаторов.
  • Я мог бы использовать TRY / CATCH на INSERT вместо IF, чтобы проверить, нарушено ли ограничение.
...