CREATE TABLE table1(table1_id INT NOT NULL PRIMARY KEY);
--or
CREATE TABLE table1(table1_id INT NOT NULL, CONSTRAINT PK_TABLE1 PRIMARY KEY(table1_id) ) ;
--or
CREATE TABLE table1(table1_id INT NOT NULL, CONSTRAINT PK_TABLE1 PRIMARY KEY(table1_id)
USING INDEX (CREATE UNIQUE INDEX IDXU_TABLE1_ID ON TABLE1(table1_id))) ;
--or
CREATE TABLE table1(table1_id INT NOT NULL );
ALTER TABLE table1 ADD CONSTRAINT PK_TABLE1
PRIMARY KEY(table1_id) USING INDEX (CREATE UNIQUE INDEX IDXU_TABLE1_ID ON TABLE1(table1_id));
如果在创建约束之前存在唯一索引,除非DROP INDEX使用它,否则它将被保留。
CREATE TABLE table1(table1_id INT NOT NULL );
CREATE INDEX IDXU_TABLE1_ID ON TABLE1(table1_id);
ALTER TABLE table1 ADD CONSTRAINT PK_TABLE1
PRIMARY KEY(table1_id) USING INDEX IDXU_TABLE1_ID;
如果非唯一索引支持唯一约束,则除非DROP INDEX使用该索引,否则将保留该索引。例如
CREATE TABLE table1(table1_id INT NOT NULL, CONSTRAINT PK_TABLE1 PRIMARY KEY(table1_id)
USING INDEX (CREATE INDEX IDX_TABLE1_ID ON TABLE1(table1_id))) ;
它很容易测试。
有两种可能的情况。
场景一:
场景 1 是使用现有索引创建 PK:
将索引添加到它:
添加约束:
插入一些数据:
测试约束:
禁用约束:
再试
INSERT
一次:它成功是因为在禁用约束时唯一索引没有被禁用/删除。请注意,原始错误是
ORA-00001: unique constraint (PHIL.PK_MY_TABLE) violated
,而PHIL.IDX_PK_MY_TABLE
一旦禁用 PK 约束,就会违反索引约束。场景二:
场景 2 是在创建表时创建 PK:
禁用约束:
索引消失了!:
重新启用它会重新创建索引:
如果要保留索引:
取决于您如何禁用约束。
上面删除了索引,所以当你启用约束时,索引将被重建。下面保留了索引:
如果以这种方式禁用约束,则索引仍然可用,并且在重新启用约束时无需重新构建它。
除非我错过了什么,否则删除索引和禁用约束的行为取决于索引的创建方式以及它是否是唯一的。
1. 与约束同时创建的唯一索引,当约束被禁用时将被丢弃,除非
KEEP INDEX
被使用如果在创建约束之前存在唯一索引,除非
DROP INDEX
使用它,否则它将被保留。CREATE TABLE table1(table1_id INT NOT NULL ); CREATE INDEX IDXU_TABLE1_ID ON TABLE1(table1_id); ALTER TABLE table1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY(table1_id) USING INDEX IDXU_TABLE1_ID;
如果非唯一索引支持唯一约束,则除非
DROP INDEX
使用该索引,否则将保留该索引。例如CREATE TABLE table1(table1_id INT NOT NULL, CONSTRAINT PK_TABLE1 PRIMARY KEY(table1_id) USING INDEX (CREATE INDEX IDX_TABLE1_ID ON TABLE1(table1_id))) ;