Oracle主键
1 创建不指定主键名的主键
create table emp
(
id number(6),
first_name varchar2(20)
);
表已创建
SQL> alter table emp add primary key (id);
表已更改。
查看主键信息
SQL> select table_name, constraint_name, constraint_type, status from user_constraints where table_name = 'EMP';
TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE STATUS
-------------- ------------------------------ --------------- --------
EMP SYS_C0010818 P ENABLED
查看主键所在的列
SQL> select table_name, constraint_name, column_name from user_cons_columns where constraint_name = 'SYS_C0010818';
TABLE_NAME CONSTRAINT_NAME COLUMN_NAME
-------------- ------------------------------ ---------------
EMP SYS_C0010818 ID
2 删除主键
SQL> alter table emp drop primary key;
表已更改
查看主键信息
SQL> select table_name, constraint_name, constraint_type, status from user_constraints where table_name = 'EMP';
(结果为空)
3 创建命名主键
SQL> alter table emp add constraint pk_emp primary key (id);
表已更改。
查看主键信息
SQL> select table_name, constraint_name, constraint_type, status from user_constraints where table_name = 'EMP';
TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE STATUS
-------------- ------------------------------ --------------- --------
EMP PK_EMP P ENABLED
4 重命名主键
SQL> alter table emp rename constraint PK_EMP to PK_EMP_NEW;
表已更改。
查看主键信息
SQL> select table_name, constraint_name, constraint_type, status from user_constraints where table_name = 'EMP';
TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE STATUS
-------------- ------------------------------ --------------- --------
EMP PK_EMP_NEW P ENABLED
5 主键与索引
1)若主键列原先没有索引,则创建主键时会自动创建一个索引,索引的名称与刚创建时的主键名称一样。且索引名称不会随着主键名称被重命名而改变。删除主键会导致索引被一并删除。
SQL> select table_name, index_name, index_type from user_indexes where table_name='EMP';
TABLE_NAME INDEX_NAME INDEX_TYPE
-------------- ------------------------------ ---------------------------
EMP PK_EMP NORMAL
SQL> alter table emp drop primary key;
表已更改。
SQL> select table_name, index_name, index_type from user_indexes where table_name='EMP';
(结果为空)
2)若在某列创建主键之前该列已经创建过索引,则创建主键时不会再次创建索引,且主键与索引之间没有连带关系。删除主键不会同时删除索引。
SQL> create index ind_emp on emp(id);
索引已创建。
SQL> select table_name, index_name, index_type from user_indexes where table_name='EMP';
TABLE_NAME INDEX_NAME INDEX_TYPE
-------------- ------------------------------ ---------------------------
EMP IND_EMP NORMAL
SQL> alter table emp add primary key(id);
表已更改。
SQL> select table_name, constraint_name, constraint_type, status from user_constraints where table_name = 'EMP';
TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE STATUS
-------------- ------------------------------ --------------- --------
EMP SYS_C0010820 P ENABLED
SQL> alter table emp drop primary key;
表已更改。
SQL> select table_name, index_name, index_type from user_indexes where table_name='EMP';
TABLE_NAME INDEX_NAME INDEX_TYPE
-------------- ------------------------------ ---------------------------
EMP IND_EMP NORMAL