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
来检查约束是否被违反。
我在 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
来检查约束是否被违反。