![](/img/trans.png)
[英]Inserting a C# record into a table with multiple foreign keys in SQL Server
[英]Inserting 2 Foreign Keys in a table in SQL Server
我有以下 3 张桌子。 它们是相关的:
CREATE TABLE [MemberDetails]
(
[MemberID] int identity (1000,1) NOT NULL UNIQUE,
[MName] varchar(100) NOT NULL,
[MSurname] varchar(100) NOT NULL,
[MPhone] varchar(20) NOT NULL UNIQUE,
[MEmail] varchar(200) NOT NULL UNIQUE,
[MAddress] varchar(250) NOT NULL,
[MActive] char (1) NOT NULL CHECK (MActive IN ('Y','N')) DEFAULT 'Y',
[MUpdateDate] Date NOT NULL DEFAULT GETDATE(),
[MPhoto] Image NOT NULL,
[MDid] int NULL UNIQUE,
[MTid] int NULL UNIQUE,
PRIMARY KEY ([MemberID]),
FOREIGN KEY (MDid) REFERENCES [MembershipDetails] ([MDid])
ON DELETE SET NULL
ON UPDATE CASCADE,
FOREIGN KEY (MTid) REFERENCES [MarketingTarget] ([MTid])
ON DELETE SET NULL
ON UPDATE CASCADE
);
CREATE TABLE [MarketingTarget]
(
[MTid] int identity (5000,1) NOT NULL UNIQUE,
[MDOB] date NOT NULL,
[MSex] char NOT NULL CHECK (MSex IN ('M','F')) DEFAULT 'M',
PRIMARY KEY ([MTid]),
);
CREATE TABLE [MembershipDetails]
(
[MDid] int identity (2000,1) NOT NULL UNIQUE,
[MType] varchar(10) NOT NULL CHECK (MType IN ('Monthly', 'Quaterly', 'Yearly')) DEFAULT 'Monthly',
[JoinDate] Date NOT NULL DEFAULT GETDATE(),
[ExpiryDate] Date NULL,
[MsUpdateDate] Date DEFAULT GETDATE(),
PRIMARY KEY ([MDid])
);
我想知道是否可以将 FK 从其他两个表中自动插入到 MemberDetails 表中? 我正在尝试编写存储过程。
我正在检查可以生成最后一个身份的Scope_Identity
,但我不确定如何正确使用它。
任何建议将不胜感激。
这是一个示例(表已被缩短):由于两个 IDENTITY 值都是必需的,我将它们保存到一个变量中,然后一起插入到 MemberDetail 中。 我建议为此操作进行交易。 看看 TRY..CATCH。 根据您的情况,您可能需要检查 XACT_STATE()。
CREATE TABLE [_TEST_MemberDetails] (
[MemberID] int identity (1000,1) NOT NULL UNIQUE,
[MDid] int NULL UNIQUE,
[MTid] int NULL UNIQUE,
PRIMARY KEY ([MemberID]),
FOREIGN KEY (MDid) REFERENCES [_TEST_MembershipDetails] ([MDid]) ON DELETE SET NULL
ON UPDATE CASCADE,
FOREIGN KEY (MTid) REFERENCES [_TEST_MarketingTarget] ([MTid]) ON DELETE SET NULL
ON UPDATE CASCADE
);
CREATE TABLE [_TEST_MarketingTarget] (
[MTid] int identity (5000,1) NOT NULL UNIQUE,
[MDOB] date NOT NULL,
[MSex] char NOT NULL CHECK (MSex IN ('M','F')) DEFAULT 'M',
PRIMARY KEY ([MTid]),
);
CREATE TABLE [_TEST_MembershipDetails] (
[MDid] int identity (2000,1) NOT NULL UNIQUE,
[MType] varchar(10) NOT NULL CHECK (MType IN ('Monthly','Quaterly','Yearly')) DEFAULT 'Monthly',
[JoinDate] Date NOT NULL DEFAULT GETDATE(),
[ExpiryDate] Date NULL,
[MsUpdateDate] Date DEFAULT GETDATE(),
PRIMARY KEY ([MDid])
);
-- SP CODE START HERE
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION
DECLARE @MTID int = 0, @MDID int = 0
INSERT INTO _TEST_MarketingTarget ([MDOB], [MSex])
VALUES ('Jan 1, 2020', 'M')
SELECT @MTID = SCOPE_IDENTITY()
INSERT INTO [_TEST_MembershipDetails] ([MType], [JoinDate], [ExpiryDate], [MsUpdateDate])
VALUES (DEFAULT, DEFAULT, 'Jan 1, 2020', DEFAULT)
SELECT @MDID = SCOPE_IDENTITY()
INSERT INTO [_TEST_MemberDetails] (Mdid, MTid)
SELECT @MDID, @MTID
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT <> 0 ROLLBACK TRANSACTION
END CATCH
go
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.