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

标签 sql database sql-server-2008 insert

在 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/

相关文章:

mysql - Union 和 join 子句返回重复值

database - 我应该对我的 postgres 表进行分区吗?

c# - 通过编程使用时,我的插入命令不会更改数据库

sql - 必须声明标量变量

sql-server - datediff期间如何避免负数

php - MySQL 计算一段时间内共享至少 3 列中的 1 列的条目数

sql - 如何在 MySQL 中创建表别名

php - 如何使用FluentPDO检测错误

sql - 如何为这个特定的表关系建模

mysql - 在 MySQL 中加载数据 Infile 问题(不正确的字符串值错误)