怎么使用SQL语句批量删除多个表的相同字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么使用SQL语句批量删除多个表的相同字段相关的知识,希望对你有一定的参考价值。

一个数据库中有多个表,我想批量删除这些表都有的一个字段,语句该怎么写?不是删除字段里的数据,是删除字段。
我是用PLSQL删除数据库里的字段,一个个删实在太累。其实我要删的就是主键啦,这个字段没用又碍事。唉,楼下两位能再说明白点么?

不知道您用的是什么数据库了。
不过做法肯定是一样,用两个游标,第一个游标从数据字典中检索出所有的表,第二个游标从每个表中检索所有的字段,然后遇到有要和你删除名称相同的字段的时候,执行alter table tablename drop column columnname的操作。
不过这个执行不能直接这么执行,而是设置一个字符串的变量,例如SQLSERVER,需要@delsql = 'alter table ' + @tablename + ' drop column ' + @columnname
exec(@delsql)
而oracle也一样delsql = 'alter table ' + tablename + ' drop column ' + columnname;
execute immediate delsql;
要使用这样的写法。
不可能使用一个SQL直接删除所有的。追问

不明白,是不是还是要条条删啊?那依然很麻烦哎……

追答

您用的什么数据库?
您要执行的是ALTER TABLE TB_EMP DROP COLUMN EMP_NAME。。。这样的操作吧?
就是删除表TB_EMP中EMP_NAME这一列,不过你的这一列在其他表中也存在,你要在其他表中同样删除这个一列,是吧?
------PL/SQL执行
declare
colname varchar2(100):='要删除的列名大写';
tbname varchar2(100);
colValue varchar2(500);
delsql varchar2(1000);
--返回表名
cursor cursor_tbname is select DISTINCT table_name from user_tab_columns where column_name=colname;
begin
open cursor_tbname;
loop
fetch cursor_tbname into tbname;
exit when cursor_tbname%notfound;
delsql := 'alter table ' ||tbname|| ' drop column '||colname;
execute immediate delsql;
end loop;
close cursor_tbname;
end ;

参考技术A 这个批量删除写个存储过程就行了
给你个思路
删除表中一个字段
删除列语句-alter table 表名
drop column 列名;
写个存储过程把要删除的表都写进去,执行就OK 了。
参考技术B 这本身就是不安全的,数据库不会给你提供这样的功能,你还是通过程序脚本来实现吧!

select name from SysObject
alter table tablename drop yourfield追问

不明白

参考技术C 你说不删除数据那不就是修改主键的字段名么追问

是把字段删掉,不管里面有米数据,不过其实里面确实没数据

Spring JDBC - 针对多个表的批量插入

【中文标题】Spring JDBC - 针对多个表的批量插入【英文标题】:Spring JDBC - Bulk insert targeting multiple tables 【发布时间】:2013-04-27 10:03:29 【问题描述】:

使用 JDBC (Oracle),我需要将数千行插入到三个不同的表中。基本上,我想在一个循环中一个接一个地执行 3 个插入 SQL 语句。

我阅读了this link,我想知道哪个实现更好(就执行时间而言):

    批量执行第一条SQL语句,取回生成的key 使用步骤 1 中生成的密钥批量执行第二条 SQL 语句并检索新生成的密钥 使用第 1 步和第 2 步生成的键执行第三条 SQL 语句

或循环遍历每条记录以插入,并为每条记录一个接一个地执行 3 个 SQL 语句。

我知道第一个实现是依赖于数据库的(因为不是每个数据库都支持ResultSet.getGeneratedKeys())。也许还有第三种我没有想到的实现方式?

我想使用单个连接,因此,对于这两种实现,我将首先获得一个连接,执行每个插入操作,最后提交并关闭连接。

另外,我想知道我是否可以使用任何 Spring JDBC 抽象。 Spring JdbcTemplace 的第二个实现似乎是可能的(用@Transactional 包装方法以使用相同的连接)但第一个看起来很困难,因为 JdbcTemplate 的方法 batchUpdate 不返回生成的密钥。

【问题讨论】:

【参考方案1】:

如果执行时间不是问题,我会选择第二种方式。它不易出错,更容易被其他同事阅读。此外,您可以更好地控制交易。例如,您可以在 3 次插入完成后提交。

对于第一种方式:绕过GeneratedKeys问题,您可以在第一组INSERTs之后创建SELECT并获取ID(GeneratedKeys),然后使用检索到的第二组插入ID 等等……但我认为这很混乱。

也可以考虑使用存储过程

【讨论】:

以上是关于怎么使用SQL语句批量删除多个表的相同字段的主要内容,如果未能解决你的问题,请参考以下文章

mysql批量删除,已经获得id,条件是另一个表,不存在的就删除,请问sql语句怎么写?

sql命令删除id用SQL语句批量删除指定ID

MYSQL执行sql语句,批量更改为指定时间段的随机时间

sql 语句 批量删除指定id

SQL 如何对数据库中相同名称的表中数据进行批量修改

在sql中有个表a,有一列名为b的数据如bb,后面有几个空格,所以数据都是,怎么批量删除数据后面的空格?