如何将一列中的数据插入到另一张表中

时间:2019-01-15 14:06:24

标签: sql-server sql-server-2008

我在工作中一直为这个问题苦苦挣扎,我需要一些帮助。

我有2个表,一个表包含大量信息,而另一个表应包含部分信息,我需要将单列移动到已经用某些代码创建的表中,以标识将要插入的每一行(主要是用户),并抛出错误,因为它说我也必须插入一个ID,但是该ID已经存在。

假设我有这些表格:

table_information
admin_name|admin_address|admin_phone|admin_mail
john      |home         |111111111  |something@mail.com
pete      |house        |222222222  |else@mail.com
mike      |crib         |333333333  |my@mail.com
ryan      |someplace    |444444444  |custom@mail.com
daniel    |somewhere    |555555555  |user@mail.com
bruce     |anywhere     |666666666  |bruce@mail.com
dave      |everywhere   |777777777  |dave@mail.com


table_admin
admin_id|admin_name
1       |
2       | 
3       |
4       |
5       |
6       |
7       |

并且我需要将用户名列移动到具有代码的表用户,所以结果必须是这样的:

table_information
admin_name|admin_address|admin_phone|admin_mail
john      |home         |111111111  |something@mail.com
pete      |house        |222222222  |else@mail.com
mike      |crib         |333333333  |my@mail.com
ryan      |someplace    |444444444  |custom@mail.com
daniel    |somewhere    |555555555  |user@mail.com
bruce     |anywhere     |666666666  |bruce@mail.com
dave      |everywhere   |777777777  |dave@mail.com

table_admin
admin_id|admin_name
1       | john
2       | pete
3       | mike
4       | ryan
5       | daniel
6       | bruce
7       | dave

信息来自一个大型数据库(大约1500行),在该数据库中重复了管理员的姓名,因此我一直在使用select unique来过滤某些重复的行。

我一直这样做的方式是这样的:

INSERT INTO table_admin (admin_name)
SELECT DISTINCT admin_name FROM table_information

我得到这个:

Cannot insert the value NULL into column 'admin_id' column does not allow nulls. INSERT fails.

同样重要的是,表admin_id中的列table_admin不能是标识(或自动递增),因此无法自动生成ID(我本可以这样做,但是他们在这里的工作方式)。

我缺少什么吗?做错了什么?让我知道一些建议或解决方案,这使我发疯。

感谢您的阅读。

1 个答案:

答案 0 :(得分:1)

  

无法将值NULL插入列'admin_id'列中不允许为空。 INSERT失败。

出现此错误的原因是因为admin_id不是NULLABLE,这意味着您必须每行都有一个admin_id。执行INSERT时,必须明确插入admin_id,因为它不是IDENTITY属性列。

您的预期结果表明您想要执行UPDATE,而不是INSERTUPDATEUPDATE表中当前的admin_id table_admin而不是插入新行。 尚不清楚的一件事是table_admintable_information的关系。约翰如何分配admin_id = 1

定义后,这里是UPDATE

update t 
set t.admin_name = i.admin_name
from table_admin t
inner join table_information i on i.someColumn = t.someColumn

如果您不关心哪个admin_name得到什么admin_id,则可以创建代理键并更新表。看起来像这样:

select distinct 
    admin_name
    ,admin_id = row_number() over (order by (select null))
into #tempInformation
from table_information

--this is going to show the admin_id that will be updated in the table_admin table
select * from #tempInformation

update t 
set t.admin_name = i.admin_name
from table_admin t
inner join #tempInformation i on i.admin_id = t.admin_id

编辑

如果admin_name中当前没有任何 table_admin,则建议您截断该表并插入不同的admin_name。同样,我也将admin_id设为身份属性

truncate table table_admin

insert into table_admin (admin_id, admin_name)
   select distinct 
        admin_id = row_number() over (order by (select null))
        ,admin_name

我应该强调指出,在大多数架构中,admin_id意味着某些。该表将是PRIMARY KEY,用于将该表与数据库中的其他表相关。因此,不知道哪个admin_id转到哪个admin_name意味着您手上的情况真是一团糟,随机分配它们应该会破坏下游流程...但是那可能不会之所以如此,是因为您没有一直坚持下去。

  

表table_admin中的admin_id列不能为身份

我想问为什么?这将暗示您已经有admin_nameadmin_id的映射...但是您没有显示。