当table2存在重复名称条目时,如何向table1导入数据并生成对应新记录
解决table2数据导入table1并保留重复记录的方案
嘿,这个需求其实思路很清晰,咱们一步步来搞定它:
首先得提个关键点:你原来的table1里NAME是唯一的(应该有唯一约束),但现在要导入table2里重复的NAME记录,所以第一步必须先把这个唯一约束去掉,不然插入重复值的时候数据库会直接报错。
第一步:移除table1的NAME唯一约束(如果存在)
不同数据库的语法略有不同,我给你几个常用的例子:
- 如果你用的是MySQL,先查一下约束名称:
SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'table1' AND COLUMN_NAME = 'NAME' AND CONSTRAINT_TYPE = 'UNIQUE';
然后用查到的约束名称删除:
ALTER TABLE table1 DROP CONSTRAINT 你查到的约束名;
- 要是Oracle的话,查约束名:
SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'TABLE1' AND CONSTRAINT_TYPE = 'U' AND COLUMN_NAME = 'NAME';
删除约束:
ALTER TABLE TABLE1 DROP CONSTRAINT 你查到的约束名;
- SQL Server的话,可直接用这个语句删除(或先查询约束名再删除):
ALTER TABLE table1 DROP CONSTRAINT UQ__table1__737584F6; -- 替换为实际约束名
第二步:把table2的所有数据插入table1
这一步就简单了,用INSERT INTO...SELECT语句直接把table2的所有NAME记录导进去,table2里重复的NAME会自动在table1里生成对应的新记录:
INSERT INTO table1 (NAME) SELECT NAME FROM table2;
最终效果验证
执行完上面的操作后,table1的记录会变成这样:
| NAME |
|---|
| A |
| B |
| C |
| D |
| A |
| A |
| B |
| B |
完全符合你要的结果——既保留了table1原来的记录,又把table2里的所有记录(包括重复的)都加进去了。
另外提醒一句:如果之后你又想让table1的NAME变回唯一,那肯定不行,因为已经有重复记录了,得先处理掉重复数据才能加回唯一约束哦。
内容的提问来源于stack exchange,提问作者rag
相关产品推荐
相关产品推荐

