【问题标题】:How to add a primary (Surrogate) key from one table into a foreign key of another table?如何将一个表中的主(代理)键添加到另一个表的外键中?
【发布时间】:2015-11-01 14:14:53
【问题描述】:

我正在尝试将客户表中的 CustId(主键)添加到 CustomerAddress 表中的 CustID(外键)中。但我无法自动添加外键。我该怎么办。下面是我的架构(我从我的 SQL Server 实例复制它)

CREATE TABLE [dbo].[Customers] 
(
           [CustId]           INT           IDENTITY (1, 1) NOT NULL,
           [FirstName]        NVARCHAR (50) NOT NULL,
           [MiddleName]       NVARCHAR (50) NULL,
            [LastName]         NVARCHAR (50) NOT NULL,
            [Salutation]       NVARCHAR (10) NULL,
            [Position]         NVARCHAR (50) NULL,
            [OrganizationType] NVARCHAR (50) NULL,
            [PhoneNumber]      NVARCHAR (50) NOT NULL,
            [Ext]              NCHAR (10)    NULL,
            [FaxNumber]        NVARCHAR (50) NULL,
            [CellNumber]       NVARCHAR (50) NULL,
            [EmailAddress]     NVARCHAR (50) NOT NULL,
            [EmailPermission]  NCHAR (10)    NOT NULL,
            [Password]         NVARCHAR (50) NOT NULL,
            PRIMARY KEY CLUSTERED ([CustId] ASC)
);

CREATE TABLE [dbo].[CustomerAddress] 
(
            [AddressID] INT NOT NULL IDENTITY (1, 1),
            [CustID]           INT,
            [OrganizationName] NVARCHAR (50) NOT NULL,
            [Division]         NVARCHAR (50) NULL,
            [Department]       NVARCHAR (50) NOT NULL,
            [BuildingRoom]     NVARCHAR (50) NULL,
            [Street]           NVARCHAR (50) NULL,
            [City]             NVARCHAR (50) NULL,
            [POBox]            NVARCHAR (50) NULL,
            [Province]         NVARCHAR (50) NULL,
            [PostalCode]       NCHAR (10)    NOT NULL,
            [Country]          NVARCHAR (30) NOT NULL,
            [AddressType]      CHAR (10)     NOT NULL,
            PRIMARY KEY CLUSTERED ([AddressID]),
            CONSTRAINT [FK_CustID] FOREIGN KEY ([CustID]) REFERENCES [dbo].[Customers] ([CustId])
);

插入数据的C#代码:

public int AddCustomerDeliveryAddress(CustomerAddressBLL NewCustomerDeliveryAddressBLL)
{
            string sql = string.Format(@"Insert into CustomerAddress (OrganizationName,Division,Department,BuildingRoom,Street,City,POBox,Province,PostalCode,Country,AddressType)
                        Values(@OrganizationName,@Division,@Department,@BuildingRoom,@Street,@City,@POBox,@Province,@PostalCode,@Country,@AddressType)");

            db.AddParameter("@OrganizationName", NewCustomerDeliveryAddressBLL.Organization);
            db.AddParameter("@Division", NewCustomerDeliveryAddressBLL.Division);
            db.AddParameter("@Department", NewCustomerDeliveryAddressBLL.Department);
            db.AddParameter("@BuildingRoom", NewCustomerDeliveryAddressBLL.BuildingRoom);
            db.AddParameter("@Street", NewCustomerDeliveryAddressBLL.Street);
            db.AddParameter("@City", NewCustomerDeliveryAddressBLL.City);
            db.AddParameter("@POBox", NewCustomerDeliveryAddressBLL.PoBox);
            db.AddParameter("@Province", NewCustomerDeliveryAddressBLL.Province);
            db.AddParameter("@PostalCode", NewCustomerDeliveryAddressBLL.PostalCode);
            db.AddParameter("@Country", NewCustomerDeliveryAddressBLL.Country);
            db.AddParameter("@AddressType", NewCustomerDeliveryAddressBLL.AddressType);

            return db.ExecuteNonQuery(sql);
}

【问题讨论】:

  • 我正在使用注册表单添加这些值。
  • 就我所见,结构似乎很好 - 你的问题是什么,你的实际问题是什么?
  • @marc_s 我想根据客户表中的 CustID 值自动将相同的外键值从 CustomerAddress 添加到 CustID 中。因为我不知道在外键表中给出什么值
  • 那么请告诉我们您如何将数据插入CustomerCustomerAddress!您使用的是 T-SQL 存储过程吗?其他一些代码?原始 C#/ADO.NET 还是其他?也许是实体框架?您需要向我们展示!我们看不到您的屏幕,也看不到您的想法....
  • 它是一个 3 层 Web 应用程序,我正在为 Customer 和 CustomerAddress 使用类,每个类执行一个简单的 ADO.NET 查询。

标签: c# sql-server database database-design


【解决方案1】:

如果您在“纯”T-SQL 中执行此操作,则需要使用如下代码:

-- declare variable for your identity
DECLARE @NewCustId INT;

-- insert into your Customers table
INSERT INTO dbo.Customers([FirstName], [MiddleName], [LastName], ......)
VALUES ('John', 'Robert', 'Doe', ........);

-- get the newly inserted Identity value
SET @NewCustId = SCOPE_IDENTITY();

-- insert into CustomerAddress table
INSERT INTO dbo.CustomerAddress ([CustID], [OrganizationName], [Division], ......)
VALUES(@NewCustId, 'Orgname', 'Division', .....)

更新:好的,这是 C# 代码 - 您需要将其更改为在末尾包含 SELECT SCOPE_IDENTITY()

string sql = string.Format(@"INSERT INTO dbo.CustomerAddress (OrganizationName, Division, Department, BuildingRoom, Street, City, POBox, Province, PostalCode, Country, AddressType)
                             VALUES (@OrganizationName, @Division, @Department, @BuildingRoom, @Street, @City, @POBox, @Province, @PostalCode, @Country, @AddressType); 
                             SELECT SCOPE_IDENTITY();");

并使用此调用:

int newCustId = (int)db.ExecuteScalar(sql);

所以您现在可以从您的 INSERT 调用中取回 NewCustID - 现在在 second 插入中使用该值,您需要将数据插入到 CustomerAddress

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2020-04-11
    • 2015-04-08
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 2013-12-09
    相关资源
    最近更新 更多