Sql Oracle约束vs,约束*使用索引*
如果一个表有一个约束但没有索引,我是否可以假设唯一的区别是我将把它留给Oracle来确定如何确定对该表的更改是否违反了约束,这可能会导致Oracle不得不进行表扫描来确定它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
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
);