问题描述
我正在调查连接索引的问题
(也称为多列,复合或组合索引)。
因此,根据当前的设计,我有2列KEY1和KEY2,它们产生了我的主键pk1。
所以PK1会是这样的
现在我想做的是直接搜索连接的PK1
是否有可能直接在Oracle中执行此操作,而不是使用诸如
(也称为多列,复合或组合索引)。
因此,根据当前的设计,我有2列KEY1和KEY2,它们产生了我的主键pk1。
CREATE TABLE "myTable"
( "KEY1" VARCHAR2(7 CHAR) NOT NULL ENABLE,
"KEY2" NUMBER(7,0) NOT NULL ENABLE,
"INFO1" VARCHAR2(1 CHAR),
"INFO2" VARCHAR2(2 CHAR)
CONSTRAINT "PK1" PRIMARY KEY ("KEY1", "KEY2") ENABLE
)
K1 |K2 ------|----- 12345 |1254 564874|521 6689 |76758
所以PK1会是这样的
PK1 --------- 123451254 564874521 668976758
现在我想做的是直接搜索连接的PK1
SELECT * FROM myTable WHERE PK1 = 564874521
是否有可能直接在Oracle中执行此操作,而不是使用诸如
SELECT * FROM myTable WHERE K1 = 564874 AND K2 = 521
专家解答
您可以创建一个虚拟列,将两者连接起来。并索引:
注意: 搜索值是一个字符串。如果在这里使用数字,则数据库to_number() 是虚拟列。意味着它不会使用索引。
虽然这个要求在我看来很可疑。您可以轻松地以具有不同主键的行结束。但是相同的串联键:
除非您还可以在连接字符串上添加唯一约束,否则此方法最终必将给您带来问题。
CREATE TABLE t (
"KEY1" VARCHAR2(7 CHAR) NOT NULL ENABLE,
"KEY2" NUMBER(7,0) NOT NULL ENABLE,
"INFO1" VARCHAR2(1 CHAR),
"INFO2" VARCHAR2(2 CHAR),
CONSTRAINT "PK1" PRIMARY KEY ("KEY1", "KEY2") ENABLE
);
insert into t ( key1, key2 ) values (12345 ,1254);
insert into t ( key1, key2 ) values (564874,521);
insert into t ( key1, key2 ) values (6689 ,76758);
commit;
alter table t
add pk as ( key1 || key2 );
create index i
on t ( pk );
select * from t
where pk = '564874521';
KEY1 KEY2 INFO1 INFO2 PK
564874 521 564874521 注意: 搜索值是一个字符串。如果在这里使用数字,则数据库to_number() 是虚拟列。意味着它不会使用索引。
虽然这个要求在我看来很可疑。您可以轻松地以具有不同主键的行结束。但是相同的串联键:
insert into t ( key1, key2 ) values (56487,4521); select * from t where pk = '564874521'; KEY1 KEY2 INFO1 INFO2 PK 564874 521564874521 56487 4521 564874521
除非您还可以在连接字符串上添加唯一约束,否则此方法最终必将给您带来问题。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




