Oracle CONSTRAINT 与 CONSTRAINT *使用索引*
Oracle CONSTRAINT vs, CONSTRAINT *Using Index*
如果 table 有约束但没有索引,我可以假设唯一的区别是我将它留给 Oracle 来确定如何确定对 table 的更改是否违反约束,可能导致 Oracle 必须进行 table 扫描才能确定它?
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)
);
对比
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
);
如果用于约束的列已被索引,Oracle 将使用该索引。
否则,它会自己创建一个。
在任何情况下,都会是一个唯一索引,行会被它约束。
Oracle 在所有情况下都为 unique
(和 primary key
约束)创建索引。
using index
语句允许您:
- 在约束语句中指定索引的名称。
- 将现有索引用于新约束。
事实上,我发现这些在实践中都没有特别有用。如果您没有给出显式索引,Oracle 会为约束创建适当的索引。
如果 table 有约束但没有索引,我可以假设唯一的区别是我将它留给 Oracle 来确定如何确定对 table 的更改是否违反约束,可能导致 Oracle 必须进行 table 扫描才能确定它?
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)
);
对比
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
);
如果用于约束的列已被索引,Oracle 将使用该索引。
否则,它会自己创建一个。
在任何情况下,都会是一个唯一索引,行会被它约束。
Oracle 在所有情况下都为 unique
(和 primary key
约束)创建索引。
using index
语句允许您:
- 在约束语句中指定索引的名称。
- 将现有索引用于新约束。
事实上,我发现这些在实践中都没有特别有用。如果您没有给出显式索引,Oracle 会为约束创建适当的索引。