Oracle主键和联合主键

在oracle数据库中,一张表中的每一行数据被称为一条记录。一条记录通常都是由多个字段所组成的。

例如,employees表的四行记录:

每一条记录都包含者若干个已经定义好的字段。同一个表的所有记录都有相同的字段定义。

对于关系表,有一个非常重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键

假如我把LIST_NAME字段作为主键,那么通过名字就能确定唯一的一条记录。但是,这样设定,就没有办法存储相同名字的同学了,因为主键具有唯一性。

由于主键的作用十分重要,如何选取主键会对业务开发产生重要影响。如果我们以员工的身份证号作为主键,似乎能唯一定位记录。但是,身份证号也是一种业务场景,如果身份证号升位了,或者需要变更,作为主键,不得不修改的时候,就会对业务产生严重影响。

所以,选取主键的一个基本原则是:不使用任何业务相关的字段作为主键。

因此,身份证号、手机号、邮箱地址这些看上去可以唯一的字段,均不可用作主键。

作为主键最好是完全业务无关的字段,我们一般把这个字段命名为id

常见的可作为id字段的类型有:自增整数类型:数据库会在插入数据时自动为每一条记录分配一个自增整数; 全局唯一标识符:GUID(全称:Globally Unique Identifier),是一种由算法生成的二进制长度为128位的数字标识符,类似于8f55d96b-8acc-4636-8cb8-76bf8abc2f57。GUID算法通过网卡MAC地址、时间戳和随机数保证任意计算机在任意时间生成的字符串都是不同的,大部分编程语言都内置了GUID算法,可以自己预算出主键。

扫描二维码关注公众号,回复: 6171115 查看本文章

例如:C#

name space GUIDTest {

          class Program{staticvoid Main(string[]args)

          {

            Console.Write Line(System.Guid.New Guid());Console.Read Key();}

          }

}

JAVA

Public class GUID{

            public static void main(String[]args)

            {

                      UUID uuid=UUID.randomUUID();

                       System.out.println(""+uuid.toString()+"");

             }

}

对于大部分应用来说,通常自增类型的主键就能满足需求。我在employees表中定义的主键也是自增类型。

Oracle数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。联合主键的列不能超过32个。主键可以在创建表时定义或者通过ALTER TABLE语法定义。

对于联合主键,允许有一列重复,只要不是所有主键列都重复即可:

创建表时添加联合主键:示例:

CREATE TABLE TEST(

     NUM_ID number(10),

     TYPE_ID number(10),

     MORE_ID number(10),

     CONSTRAINT PK_TEST PRIMARY KEY (NUM_ID, TYPE_ID,MORE_ID) -- 联合主键

);

 

如果我们把上述表的NUM_ID、TYPE_ID和MORE_ID这三列作为联合主键,那么上面的3条记录都是允许的,因为没有三列主键组合起来是相同的。

所以,在没有必要的情况下,我们尽量不使用联合主键,因为它给关系表带来了复杂度的上升。

猜你喜欢

转载自blog.csdn.net/u012289399/article/details/88986971
今日推荐