Sql Oracle约束vs,约束*使用索引*

Sql Oracle约束vs,约束*使用索引*,sql,oracle,create-table,unique-constraint,Sql,Oracle,Create Table,Unique Constraint,如果一个表有一个约束但没有索引,我是否可以假设唯一的区别是我将把它留给Oracle来确定如何确定对该表的更改是否违反了约束,这可能会导致Oracle不得不进行表扫描来确定它 CREATE TABLE SchemaName."Table1" ( field_one VARCHAR2(10 BYTE) NOT NULL, field_two VARCHAR2(30 BYTE) NOT NULL, field_three DATE NOT NULL, (etc) CONSTRAIN

如果一个表有一个约束但没有索引,我是否可以假设唯一的区别是我将把它留给Oracle来确定如何确定对该表的更改是否违反了约束,这可能会导致Oracle不得不进行表扫描来确定它

CREATE TABLE SchemaName."Table1" (
  field_one VARCHAR2(10 BYTE) NOT NULL,
  field_two VARCHAR2(30 BYTE) NOT NULL,
  field_three DATE NOT NULL,
  (etc)
  CONSTRAINT client_iu1 UNIQUE (field_one,field_two,field_three)
);
vs


如果用于约束的列已经被索引,Oracle将使用该索引

否则,它将自己创建一个


在任何情况下,都会有一个唯一的索引,并且行将受到它的约束。

Oracle在所有情况下都会为
唯一的
(和
主键
约束)创建索引

using index
语句允许您:

  • 在constraint语句中指定索引的名称
  • 将现有索引用于新约束

事实上,我并不认为这两种方法在实践中特别有用。如果未提供显式索引,Oracle将为约束创建适当的索引。

很高兴您指定了该索引。并非所有类型的约束都会创建索引。@AaronLS。我认为
使用索引
只允许在唯一和主键索引上使用。这个问题不适用于任何其他类型的约束。我不是说
使用index
子句,我是说为约束自动创建索引。有些人似乎认为索引是为所有类型的约束创建的,但事实并非如此。您的语句是准确的,并指示只有某些类型的约束才会自动创建索引。干杯
CREATE TABLE SchemaName."Table1" (
  field_one VARCHAR2(10 BYTE) NOT NULL,
  field_two VARCHAR2(30 BYTE) NOT NULL,
  field_three DATE NOT NULL,
  (etc)
   CONSTRAINT client_ak1 UNIQUE (field_one,field_two,field_three) USING INDEX fds_base.client_iu1
);