SQL - 传输 Table(?) 唯一数据

SQL - Transfer Table(?) unique data

我在 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个人在将连接数据放入CTA时共享相同的AddressID(AID)?现在,我知道我上面的 SP 将为每个地址提供不同的 ID。但是我不知道如何拥有唯一地址。

谢谢!

首先,定义 Addresses table 不允许重复:

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 子句来 return 插入的 ID。
  • 我可能会在 INSERT 上使用 TRY/CATCH 而不是 IF 来检查约束是否被违反。