【问题标题】:How do I add a cluster on a composite key?如何在复合键上添加集群?
【发布时间】:2020-08-17 14:15:23
【问题描述】:

我已经创建了一个集群

create cluster abc_clus
(abc_key int)
;

然后基于该集群创建一个索引

create index abc_clus_idx
on cluster abc_clus;

我尝试在这 4 个表上添加此集群以进行 complex 连接

 create table number1
(
    dateofbirth date,  
    Time timestamp(0), 
    IDnumber int not null,
    class varchar(7) not null, 
primary key (dateofbirth, Time, class))
cluster abc_clus(class);

  create table number2(
    tutornumber int not null,
    forename varchar2(20) not null,
 constraint number2 primary key (tutornumber))
       cluster abc_clus(tutornumber);

create table number3
(
constraint number3 primary key (Roomnumber),
Roomnumber int not null, 
xyz varchar(20))
cluster abc_clus(Roomnumber3);

create table number4
(
constraint class_pk primary key (classnumber),
classnumber int not null)
 cluster abc_clus(classnumber);

但是,当我尝试这个时,我得到了这个错误:

ORA-01753:列定义与聚集列定义不兼容

我想知道如何在复合键上添加集群的正确方法是:名字、姓氏、地址。

我正在使用 SQL plus。

谢谢

【问题讨论】:

  • 您需要定义集群表中的所有列以及数据类型。
  • 我很困惑?我需要对我创建的表进行更改吗?
  • 现在我很困惑,我以为你想要集群表中的复合键。这完全取决于你的要求和所涉及的表。
  • 是否还有其他共享公共列的表?你为什么要首先创建一个集群?
  • 是的,我会更新问题以更清楚

标签: sql oracle indexing sqlplus composite-key


【解决方案1】:

表列需要与簇列具有相同的数据类型。在您的示例中,这很好用:

create table test1 (
  id int
) cluster abc_clus(id);
Table TEST1 created.

如果数据类型匹配,即使复合键也有效:

create table test2 (
  a int,
  b int,
  primary key(a, b)
) cluster abc_clus(a);
Table TEST2 created.

但是,如果数据类型不同,您会收到错误消息:

create table test3 (
  vc varchar2(7)
) cluster abc_clus(vc);
ORA-01753: column definition incompatible with clustered column definition

而且数据类型必须完全相同,即使intnumber不兼容:

create table test4 (
  n NUMBER
) cluster abc_clus(n);
ORA-01753: column definition incompatible with clustered column definition

编辑:

您甚至可以拥有复合集群:

创建集群 idc_clus ( 我诠释, 日期 );

在集群idc_clus上创建索引idc_clus_idx;

创建表 test5 ( 我诠释, d 日期, 主键 (i,d) ) 集群 idc_clus(i, d);

【讨论】:

  • 我明白你的意思。那么有什么方法可以创建一个由具有 2 个或更多不同数据类型的列组成的复合键并能够创建一个集群?在我的问题中修复我的示例的唯一方法是删除包含复合键的表并确保所有其他表的主键数据类型相同?
  • 主键是一个逻辑的东西,你用它来识别表中的行。集群是加速访问相关数据的物理事物。 Concept Guide 中对集群进行了很好的解释
  • 是的,但是当我们创建集群时,我们必须添加这个 '(abc_key int)' ,这不是标识将在表中使用的所有数据类型的键吗?就像我们将集群链接到表时一样?
  • 是的,完全正确。重要的位是数据类型。列名可以不同,但​​数据类型必须相同。
  • 正如文档所解释的“集群键是集群表共有的一个或多个列。例如,员工和部门表共享部门 ID 列。您在创建集群时指定集群键表簇以及在创建每个表时添加到表簇中。”
猜你喜欢
  • 2020-08-17
  • 2017-07-27
  • 2018-08-24
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
相关资源
最近更新 更多