当前位置:网站首页 > SQL数据库编程 > 正文

mysql主键的建立3种方法(mysql主键的定义)



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 P
SQL> 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到底做了什么,

SQL> 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 selected
SQL> 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主键的定义)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • sql数据库文件在哪(sqlserver的数据库文件在哪?)2025-11-07 09:36:09
  • mysql主键索引和聚集索引(mysql索引和主键的区别)2025-11-07 09:36:09
  • sql循环语句的几种写法(sql循环语句的几种写法区别)2025-11-07 09:36:09
  • 数据库增删改查面试题(sql数据库增删改查操作面试)2025-11-07 09:36:09
  • sqlldr字符集(sqlloader 字符集)2025-11-07 09:36:09
  • mysql的主键自增(mysql主键自增删除一行怎么连续)2025-11-07 09:36:09
  • sql server打开sql文件(sqlserver打开sql文件)2025-11-07 09:36:09
  • pyspark读取mysql(PySpark读取hdfs文件后可以再次读取吗)2025-11-07 09:36:09
  • mysql主键是唯一的吗(mysql主键的作用)2025-11-07 09:36:09
  • sql中循环(sql循环函数)2025-11-07 09:36:09
  • 全屏图片