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

时间:2018-07-01 11:45:33

标签: sql sql-server database sql-server-2017

我在SQL领域非常环保,所以我不知道真正的想法或类型是什么,但是我将它们称为“ Transfer table”,并且将尝试解释我的意思和问题。请纠正我!

说明

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

将连接数据放入CTA时,是否可以让两个人共享相同的AddressID(AID)?现在,我得到上面的SP将为每个地址提供不同的ID。但是我不知道如何拥有唯一的地址。

谢谢!

1 个答案:

答案 0 :(得分: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子句返回插入的ID。
  • 我可能在TRY而不是CATCH上使用INSERT / IF来检查约束是否违反。