在 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