SQL - таблица переноса (?) уникальных данных

Я очень зеленый в области 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

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

Спасибо!


person Kalle    schedule 01.07.2018    source источник


Ответы (1)


Во-первых, определите таблицу 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, чтобы проверить, не нарушено ли ограничение.
person Gordon Linoff    schedule 01.07.2018
comment
Блин, когда я смотрю на твой код, он кажется таким простым! Я понимаю, что вы делаете, но о вашей процедуре изменения. Я изменил написание, чтобы оно соответствовало моему, с Addresses to Addresses. Но unq_Addresses_Address уникальный (Адрес); - это на какой колонке? Еще раз огромное спасибо дружище за очень быстрый ответ! - person Kalle; 01.07.2018
comment
@Калле. . . Я исправил ответ. - person Gordon Linoff; 01.07.2018