用外键批量插入表中

问题描述 投票:1回答:2

我有一个客户表,其中包含客户的详细信息。以下是字段

CustId (PrimaryKey), Name, Date of Birth

我还有另一个表,资产信息。有以下字段-

AssetId (PrimaryKey), AssetValue, CustId (Foreign Key Reference) 

我的CSV文件就是这样

Name, Date of Birth, AssetValue 

并且我必须将其插入两个表中。我拆分了CSV文件,其中一个使用出生日期名称,另一个仅使用AssetValue。

这是我所做的-

/*Creation of Table*/
CREATE TABLE Customer
(
    custid int identity(1,1) not null, 
    name nvarchar(50) not null, 
    dateofbirth datetime not null, 
    primary key (custid) 
)
CREATE TABLE Asset
(
    AssetId int identity(1,1) not null, 
    AssetDollars money not null, 
    primary key (AssetId),
    CustId int foreign key references Customer(custid)
)

对于批量插入,我所做的就是这个。我使用名称和出生日期这两个字段为客户创建了一个视图,然后插入了记录。

这是我所做的-

CREATE view vw_bulk_insert_customer
AS
    SELECT name, dateofbirth FROM customer

BULK  INSERT vw_bulk_insert_customer
FROM 'C:\Customer.csv'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)

这很好用。

现在,如何将其插入带有CustId的Asset表中(因为在CSV文件中不可用)。

我不允许更改CSV文件。我可以拆分CSV文件,这是允许的。

我不知道该怎么做...有什么想法吗?

sql-server-2005
2个回答
0
投票

您可以对外键使用禁用novalidate。导入所有数据后,您可以对外键启用novalidate。主键也可以执行此操作。使用novalidate选项的好处是不会根据该约束的规则检查您以前的数据,但是将检查之后的数据。如果您希望我可以粘贴整个语法以进行相同的操作


0
投票

一种选择是将数据原样导入到临时表中,然后将数据从该表复制到最终表中。这实质上是规范化数据库的后一部分(跳过规范化表的设计和定义)。

/* interim table */
CREATE TABLE CustomerAssets (
    name NVARCHAR(50) NOT NULL,
    dateOfBirth DATETIME NOT NULL,
    assetDollars MONEY NOT NULL
)

BULK INSERT CustomerAssets
  FROM 'C:\Customer.csv'
  WITH (
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
  )

INSERT INTO Customer (name, dateOfBirth)
  SELECT name, dateOfBirth FROM CustomerAssets;

INSERT INTO Asset (assetDollars, custId)
  SELECT CA.assetDollars, Customer.custId
    FROM CustomerAssets AS CA
      INNER JOIN Customer
        ON CA.name = Customer.name AND CA.dateOfBirth = Customer.dateOfBirth;
© www.soinside.com 2019 - 2024. All rights reserved.