我在工作中一直为这个问题苦苦挣扎,我需要一些帮助。
我有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(我本可以这样做,但是他们在这里的工作方式)。
我缺少什么吗?做错了什么?让我知道一些建议或解决方案,这使我发疯。
感谢您的阅读。
答案 0 :(得分:1)
无法将值NULL插入列'admin_id'列中不允许为空。 INSERT失败。
出现此错误的原因是因为admin_id
不是NULLABLE
,这意味着您必须每行都有一个admin_id
。执行INSERT
时,必须明确插入admin_id
,因为它不是IDENTITY
属性列。
您的预期结果表明您想要执行UPDATE
,而不是INSERT
。 UPDATE
将UPDATE
表中当前的admin_id
table_admin
而不是插入新行。 尚不清楚的一件事是table_admin
与table_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_name
到admin_id
的映射...但是您没有显示。