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表插入到用户表中.
我怎样才能做到这一点?
我尝试了以下方法:
INSERT INTO Users(Name, Age)
Values((SELECT Name FROM NewUsers),20)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何为每个插入的用户创建一个新的地址记录,并相应地指定外键.
非常感谢您的帮助
一种方法是使用两个查询,形成如下:
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
如果要保证事务一致性,如果多个插入可以同时发生,或者如果您想允许重复的名称等,有更复杂的方法可以做到这一点.但是根据您给出的示例和目前为止的详细信息,此方法应该工作.