在 Oracle DB 中,有没有办法用一个命令在每一列上创建索引?
in Oracle DB, is there a way to create an index on each column with one command?
假设我此时有一个 table 有 4 列
describe TableA;
column1 varchar(10);
column2 varchar(10);
column3 varchar(10);
column4 varchar(10);
我想为每一列创建一个索引,所以我会
create index idx_1 on TableA(column1);
create index idx_2 on TableA(column2);
create index idx_3 on TableA(column3);
create index idx_4 on TableA(column4);
有没有办法更轻松地实现这一点?有单行解决方案吗?
正在使用的Oracle数据库版本为12C
不!
你必须编写脚本,为索引指定唯一名称,设置 columns/options 和 运行 它...
这一次的事情,所以应该不会那么难...
不是你不能,
但是你可以写一个查询,它给你那个脚本
select 'create index IX_TA_' || COLUMN_NAME || ' on ' || TABLE_NAME || '(' || COLUMN_NAME || ');' as sql_ix
from ALL_TAB_COLUMNS
where table_name='TABLEA';
给予
SQL_IX
create index IX_TA_ID on TABLEA(ID);
create index IX_TA_COLUMN1 on TABLEA(COLUMN1);
create index IX_TA_COLUMN2 on TABLEA(COLUMN2);
create index IX_TA_COLUMN3 on TABLEA(COLUMN3);
create index IX_TA_COLUMN4 on TABLEA(COLUMN4);
你可以直接复制粘贴然后 运行...
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=dc1e908c2d7f772070a1db2a504a1f96
如果您需要 4 个不同的索引,唯一的方法是动态 SQL:
begin
for c in
(
select column_name
from user_tab_columns
where table_name = 'TABLEA'
)
loop
execute immediate 'create index idx_' || regexp_substr(c.column_name, '\d+') || ' on tableA(' || c.column_name || ')';
end loop;
end;
这相当于
create index idx_1 on tableA(column1);
create index idx_2 on tableA(column2);
create index idx_3 on tableA(column3);
create index idx_4 on tableA(column4);
当然,这只有在您有很多列时才有意义,假设您需要为每一列创建一个索引,并且所有列的名称都类似于 columnXX。
不同的是,如果您需要所有列的单个索引,则需要
create index idx_XX on tableA(column1, column2, column3, column4)
但这取决于您需要如何访问 table
假设我此时有一个 table 有 4 列
describe TableA;
column1 varchar(10);
column2 varchar(10);
column3 varchar(10);
column4 varchar(10);
我想为每一列创建一个索引,所以我会
create index idx_1 on TableA(column1);
create index idx_2 on TableA(column2);
create index idx_3 on TableA(column3);
create index idx_4 on TableA(column4);
有没有办法更轻松地实现这一点?有单行解决方案吗?
正在使用的Oracle数据库版本为12C
不!
你必须编写脚本,为索引指定唯一名称,设置 columns/options 和 运行 它...
这一次的事情,所以应该不会那么难...
不是你不能, 但是你可以写一个查询,它给你那个脚本
select 'create index IX_TA_' || COLUMN_NAME || ' on ' || TABLE_NAME || '(' || COLUMN_NAME || ');' as sql_ix
from ALL_TAB_COLUMNS
where table_name='TABLEA';
给予
SQL_IX
create index IX_TA_ID on TABLEA(ID);
create index IX_TA_COLUMN1 on TABLEA(COLUMN1);
create index IX_TA_COLUMN2 on TABLEA(COLUMN2);
create index IX_TA_COLUMN3 on TABLEA(COLUMN3);
create index IX_TA_COLUMN4 on TABLEA(COLUMN4);
你可以直接复制粘贴然后 运行...
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=dc1e908c2d7f772070a1db2a504a1f96
如果您需要 4 个不同的索引,唯一的方法是动态 SQL:
begin
for c in
(
select column_name
from user_tab_columns
where table_name = 'TABLEA'
)
loop
execute immediate 'create index idx_' || regexp_substr(c.column_name, '\d+') || ' on tableA(' || c.column_name || ')';
end loop;
end;
这相当于
create index idx_1 on tableA(column1);
create index idx_2 on tableA(column2);
create index idx_3 on tableA(column3);
create index idx_4 on tableA(column4);
当然,这只有在您有很多列时才有意义,假设您需要为每一列创建一个索引,并且所有列的名称都类似于 columnXX。
不同的是,如果您需要所有列的单个索引,则需要
create index idx_XX on tableA(column1, column2, column3, column4)
但这取决于您需要如何访问 table