Oracle中创建主键,可以有几种方式。
SQL> create table t_pk_01 (id number, constraint pk_id_01 primary key(id));Table created.
创建主键约束的同时,他会自动创建一个唯一索引,
SQL> select table_name, constraint_name, constraint_type from user_constraints where table_name='T_PK_01';TABLE_NAME CONSTRAINT_NAME C------------------------------ ------------------------------ -T_PK_01 PK_ID_01 PSQL> select table_name, index_name, uniqueness from user_indexes where table_name='T_PK_01';TABLE_NAME INDEX_NAME UNIQUENES------------------------------ ------------------------------ ---------T_PK_01 PK_ID_01 UNIQUE
SQL> create table t_pk_02 (id number);Table created.SQL> alter table t_pk_02 add constraint pk_id_02 primary key (id);Table altered.
我们从10046来看下alter table到底做了什么,
alter session set events '10046 trace name context forever, level 12';Session altered.SQL> alter session set tracefile_identifier='bisal';Session altered.SQL> alter table t_pk_02 add constraint pk_id_02 primary key (id);Table altered.SQL> alter session set events '10046 trace name context off';Session altered.SQL> select distinct(m.sid),p.pid,p.tracefile from v$mystat m,v$session s,v$process p where m.sid=s.sid and s.paddr=p.addr;SID PID TRACEFILE---------- ----------- -------------------------------------------------------------------------------189 22 /u01/app/oracle/diag/rdbms/dcm/DCM/trace/DCM_ora_18653_bisal.trc
从trace我们能看到,对T_PK_02加了share模式锁,指定nowait,先创建的约束,然后创建了唯一索引,
...LOCK TABLE "T_PK_02" IN SHARE MODE NOWAIT...alter table t_pk_02 add c...update con$ ......insert into con$ ......CREATE UNIQUE INDEX "BISAL"."PK_ID_02" on "BISAL"."T_PK_02"("ID") NOPARALLEL
第三种,分开创建主键约束和主键索引。
主要有两个场景。
(1) 当使用CTAS创建表时,
SQL> create table t_pk_03 as select * from t_pk_01;Table created.
主键约束并未带过来,
SQL> select table_name, constraint_name, constraint_type from user_constraints where table_name='T_PK_03';no rows selectedSQL> select table_name, index_name, uniqueness from user_indexes where table_name='T_PK_03';no rows selected
此时如果表中存在很多的数据,直接使用方法2,可能会带来两个问题,
1. 创建唯一索引的用时。
2. 唯一索引允许包含空值,因为主键约束不允许空值,还需要判断字段是否为空的用时。
对(2),如果字段设置NOT NULL,应该不需要判断,如果没设置,则需要判断字段中是否含空值,还是取决于表的数据量。
SQL> create unique index pk_id_03 on t_pk_03(id) online;Index created.SQL> alter table t_pk_03 add constraint pk_id_03 primary key (id);Table altered.
SQL> create unique index pk_id_03 on t_pk_03(id) tablespace xxx;Index created.
近期更新的文章:
《小白学习MySQL - 数据库软件和初始化安装》
《小白学习MySQL - 闲聊聊》
《Redis和Sentinel的安装部署和配置》
《“火线”和“零线”》
《通过索引提升SQL性能案例一则》
《如何手动添加jar包到maven本地库?》
《1元股权转让的一点思考》
《Linux恢复误删文件的操作》
《Linux的scp指令使用场景》
《如何搭建一支拖垮公司的技术团队?》
《MySQL的skip-grant-tables》
《国产数据库不平凡的一年》
《Oracle要求顺序的top数据检索问题》
《日常工作中碰到的几个技术问题》
《Oracle 19c的examples静默安装》
《Oracle 11g的examples静默安装》
《同名的同义词和视图解惑》
文章分类和索引:
《公众号700篇文章分类和索引》
到此这篇mysql主键的建立3种方法(mysql主键的定义)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sqlbc/17540.html