在 SQL 数据库中
我有一个用户表
Id Name Age AddressId
----+------+------+-----------
其中 AddressId 是表名称地址的外键
地址表:
Id Country State City ZipCode
----+---------+------+------+---------
这是一对一的关系:每个用户有 1 个地址,每个地址有一个用户
我有一个名为 NEWUsers 的新表
Id Name
----+------
它只有 Id 和 Name。
我想做的是:
编写一个脚本,将 NEWUSers 表中的所有记录插入到 Users 表中。
- 我希望所有新用户的年龄默认为 20
- 对于每个插入的新用户,我需要为他创建一个新的地址记录
- 新地址记录的所有值(国家、城市、州、邮政编码)都等于“abcd”,除了用于为新用户设置外键 AddressId 的 Id)
我该怎么做?
我尝试了以下方法:
INSERT INTO Users(Name, Age)
Values((SELECT Name FROM NewUsers),20)
但我不知道如何为每个插入的用户创建新的地址记录并相应地指定外键。
非常感谢您的帮助
最佳答案
一种方法是使用两个查询,如下所示:
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
编辑:将用户链接到地址的一种简单方法是暂时将国家/地区设置为用户名。然后您将有一个链接来确定 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;
演示:http://www.sqlfiddle.com/#!3/1f09b/8
如果您希望在多个插入可以同时发生的情况下保证事务的一致性,或者如果您希望允许重复的名称等,则有更复杂的方法可以做到这一点。但是根据您给出的示例和到目前为止的详细信息,此方法应该有效。
关于SQL:将另一个表中的数据插入到包含外键的表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10741327/