プライマリ・キーを削除する場合、インデックスは削除されますか?

8244 ワード

質問:プライマリ・キーを削除すると、同時にインデックスが自動的に削除されますか?答え:インデックスを削除するかどうかは、インデックスがプライマリ・キーを作成するときに自動的に作成されるか、プライマリ・キーを作成する前に手動で作成されるかによって異なります.プライマリ・キーを削除しながらインデックスを削除する場合は、drop indexオプションを追加することが安全です.また、外部キーリファレンスの存在による削除に失敗しないようにcascadeオプションを追加できます.以下の内容はPLSQLDeveloperで親測し、コードの読みやすいようにeclipseにフォーマット調整しました.drop index/keepindexオプションがない場合、手動でインデックスを作成し、プライマリ・キーを追加します.テーブルSQL>drop table testを作成します.drop table test ORA-00942:SQL>create table test(ID INTEGER not null)がテーブルまたはビューに存在しない.Table created–キーSQL>create unique index PK_を作成TEST on TEST(ID); Index created SQL> alter table TEST 2 add CONSTRAINT PK_TEST PRIMARY KEY (ID) using index; Table altered–索引SQLの表示>select index_name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


PK_TEST–プライマリ・キーSQL>alter table TEST drop primary keyを削除します.Table altered–インデックスを再表示します.SQL>select index_は削除されません.name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


PK_TESTはプライマリ・キーを追加し、インデックスを自動的に作成します.-テーブルSQL>drop table testを作成します.Table dropped SQL> create table test(ID INTEGER not null); Table created–プライマリ・キーを追加し、インデックスSQL>alter table TEST 2 add CONTRAINT PK_を自動的に作成TEST PRIMARY KEY (ID) using index; Table altered–索引SQLの表示>select index_name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


PK_TEST–プライマリ・キーSQL>alter table TEST drop primary keyを削除します.Table altered–SQL>select index_を削除したインデックスを再度表示します.name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


drop indexオプションをテストするときに手動でインデックスを作成し、プライマリ・キーを追加します.テーブルSQL>drop table testを作成します.Table dropped SQL> create table test(ID INTEGER not null); Table created–キーSQL>create unique index PK_を作成TEST on TEST(ID); Index created SQL> alter table TEST 2 add CONSTRAINT PK_TEST PRIMARY KEY (ID) using index; Table altered–索引SQLの表示>select index_name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


PK_TEST–プライマリ・キーSQL>alter table TEST drop primary key drop indexを削除します.Table altered–SQL>select index_が削除されたインデックスを再度表示します.name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


プライマリ・キーを追加し、インデックスを自動的に作成します.テーブルSQL>drop table testを作成します.Table dropped SQL> create table test(ID INTEGER not null); Table created–キーSQL>alter table TEST 2 add CONTRAINT PK_を作成TEST PRIMARY KEY (ID) using index; Table altered–索引SQLの表示>select index_name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


PK_TEST–プライマリ・キーSQL>alter table TEST drop primary key drop indexを削除します.Table altered–SQL>select index_が削除されたインデックスを再度表示します.name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


keep indexオプションをテストするときに手動でインデックスを作成し、プライマリ・キーを追加します.テーブルSQL>drop table testを作成します.Table dropped SQL> create table test(ID INTEGER not null); Table created–キーSQL>create unique index PK_を作成TEST on TEST(ID); Index created SQL> alter table TEST 2 add CONSTRAINT PK_TEST PRIMARY KEY (ID) using index; Table altered–索引SQLの表示>select index_name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


PK_TEST SQL>–プライマリ・キーSQL>alter table TEST drop primary key keep indexを削除します.Table altered–SQL>select index_を保持するインデックスを再度表示します.name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


PK_TESTはプライマリ・キーを追加し、インデックスを自動的に作成します.-テーブルSQL>drop table testを作成します.Table dropped SQL> create table test(ID INTEGER not null); Table created–キーSQL>alter table TEST 2 add CONTRAINT PK_を作成TEST PRIMARY KEY (ID) using index; Table altered–索引SQLの表示>select index_name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


PK_TEST–プライマリ・キーSQL>alter table TEST drop primary key keep indexを削除します.Table altered–SQL>select index_を保持したまま、インデックスを再表示します.name from user_indexes where index_name=’PK_TEST’;

INDEX_NAME


PK_TESTテストdrop indexオプションを追加するときにcascadeキーワードを使用する役割–table 1 SQL>create table table 1(ID INTEGER not null)を新規作成します.Table created–プライマリ・キー制約SQL>alter table table 1 add CONTRAINT PK_の追加TEST PRIMARY KEY (ID) using index; Table altered–3つの値1,2,3 SQL>insert into table 1 values(1)を挿入します.1 row inserted SQL> insert into table1 values(2); 1 row inserted SQL> insert into table1 values(3); 1 row inserted SQL> select * from table1;

ID

                                  1
                                  2
                                  3

-新規table 2 SQL>create table table 2(ID 1 INTEGER not null,ID 2 INTEGER not null);Table created–table 2プライマリ・キー制約SQL>alter table table 2 add constraint pk_を追加table2 primary key (ID1) using index; Table altered–tableのid SQL>alter table table 2 add constraint fk_を指すid 2の外部キー制約が追加されました.id2 foreign key (ID2) references table1(id); Table altered–table 2に3行の値(1,1)、(2,2)、(3,3)SQL>insert into table 2 values(1,1)を挿入します.1 row inserted SQL> insert into table2 values (2,2); 1 row inserted SQL> insert into table2 values (3,3); 1 row inserted SQL> select * from table2;
                                ID1                                     ID2
                                  1                                       1
                                  2                                       2
                                  3                                       3

-table 2の制約を表示します.プライマリ・キーと外部キーSQL>select*from user_が表示されます.constraints a where a.table_name=’TABLE2’;
OWNER CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME SEARCH_CONDITION R_OWNER R_CONSTRAINT_NAME DELETE_RULE STATUS DEFERRABLE DEFERRED VALIDATED GENERATED BAD RELY LAST_CHANGE INDEX_OWNER INDEX_NAME INVALID VIEW_RELATED
VOUDATA SYS_C0097617 C TABLE2 “ID1” IS NOT NULL ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED GENERATED NAME 2014/6/10 1 VOUDATA SYS_C0097618 C TABLE2 “ID2” IS NOT NULL ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED GENERATED NAME 2014/6/10 1 VOUDATA PK_TABLE2 P TABLE2 ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED USER NAME 2014/6/10 1 VOUDATA PK_TABLE2 VOUDATA FK_ID2 R TABLE2 VOUDATA PK_TEST NO ACTION ENABLED NOT DEFERRABLE IMMEDIATE VALLIDATED USER NAME 2014/6/10 1–table 1プライマリ・キーを削除し、cascadeキーを使用しない場合、SQL>alter table table 1 drop primary key drop indexをエラーで報告する.
alter table table1 drop primary key drop index
ORA-02273:このユニーク/プライマリ・キーは、いくつかの外部キーによって参照されています.
-table 1プライマリ・キーを削除し、cascadeキーを使用してSQL>alter table table 1 drop primary key cascade drop indexを間違えない.
Table altered
-table 2の制約を表示します.外部キーがSQL>select*from user_を削除しました.constraints a where a.table_name=’TABLE2’;
OWNER CONSTRAINT_NAME CONSTRAINT_TYPE TABLE_NAME SEARCH_CONDITION R_OWNER R_CONSTRAINT_NAME DELETE_RULE STATUS DEFERRABLE DEFERRED VALIDATED GENERATED BAD RELY LAST_CHANGE INDEX_OWNER INDEX_NAME INVALID VIEW_RELATED
VOUDATA SYS_C0097617 C TABLE2 “ID1” IS NOT NULL ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED GENERATED NAME 2014/6/10 1 VOUDATA SYS_C0097618 C TABLE2 “ID2” IS NOT NULL ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED GENERATED NAME 2014/6/10 1 VOUDATA PK_TABLE2 P TABLE2 ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED USER NAME 2014/6/10 1 VOUDATA PK_TABLE 2–table 2のデータを表示します.変更はありません.外部キー関連が削除されただけです.table 1を参照するデータはSQL>select*from table 2を保持します.
                                ID1                                     ID2
                                  1                                       1
                                  2                                       2
                                  3                                       3

このように、プライマリ・キーが他のテーブルで外部キーとして参照されると、プライマリ・キーが削除されdrop indexになり、cascadeキーを使用しないと実行がエラーになり、cascadeキーを使用すると関連する外部キーが同時に削除されます.この場合cascadeキーワードは慎重に使用し、外部キー関連付けが不要であることを完全に考慮して使用します.そうしないと、未知の場合に一部の外部キー関連付けを削除し、プライマリキーを調整した後に外部キーを再追加することを忘れてしまう可能性があります.