SQL:从包含外键的表中的另一个表中插入数据

You*_*sef 7 sql database insert sql-server-2008

在SQL数据库中

我有一个表用户

 Id   Name   Age    AddressId
----+------+------+-----------
Run Code Online (Sandbox Code Playgroud)

其中AddressId是表名地址的外键

地址表:

 Id   Country   State  City   ZipCode
----+---------+------+------+---------
Run Code Online (Sandbox Code Playgroud)

这是一对一的关系:每个用户有1个地址,每个地址有一个用户

我有一个名为NEWUsers的新表

Id   Name  
----+------
Run Code Online (Sandbox Code Playgroud)

它只有Id和Name.

我想要做的是:

编写脚本以将所有记录从NEWUSers表插入到用户表中.

  • 我希望所有新用户的The Age默认为20
  • 对于插入的每个新用户,我需要为他创建一个新的地址记录
  • 新的地址记录将具有等于"abcd"的所有值(国家,城市,州,邮政编码),除了将用于为新用户设置外键AddressId的Id之外)

我怎样才能做到这一点?

我尝试了以下方法:

INSERT INTO Users(Name, Age)
Values((SELECT Name FROM NewUsers),20)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何为每个插入的用户创建一个新的地址记录,并相应地指定外键.

非常感谢您的帮助

mel*_*okb 6

一种方法是使用两个查询,形成如下:

INSERT INTO Addresses (Country, State, City, ZipCode)
SELECT 'abcd', 'abcd', 'abcd', 'abcd' FROM NewUsers

INSERT INTO Users (Name, Age, AddressId)
SELECT Name, 20, ?? FROM NewUsers
Run Code Online (Sandbox Code Playgroud)

编辑:将用户链接到地址的一种简单方法是临时将国家/地区设置为用户名.然后你会有一个确定addressId的链接.填充并正确链接用户表后,您可以将国家/地区设置回默认值abcd:

insert addresses (country, state, city, zipcode)
select name, 'abcd', 'abcd', 'abcd' from newusers;

insert users (name, age, addressid)
select u.name, 20, a.id from newusers u
join addresses a on a.country = u.name;

update a
set a.country = 'abcd'
from addresses a join newusers u on a.country = u.name;
Run Code Online (Sandbox Code Playgroud)

演示:http://www.sqlfiddle.com/#!3/0909b/8

如果要保证事务一致性,如果多个插入可以同时发生,或者如果您想允许重复的名称等,有更复杂的方法可以做到这一点.但是根据您给出的示例和目前为止的详细信息,此方法应该工作.