`
sangei
  • 浏览: 329356 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

主键和外键

阅读更多

 

主键的存在就代表着表结构的完整性,表的记录必须得有唯一区分的字段,主键主要是用于其他表的外键关联,本记录的修改与删除,当我们没有主键时,这些操作会变的非常麻烦。

我强调主键不应该具有实际的意义,这可能对于一些朋友来说不太认同,比如订单表吧,会有“订单编号”字段,而这个字段呢在业务实际中本身就是应该具有唯一性,具有唯一标识记录的功能,但我是不推荐采用订单编号字段作为主键的,因为具有实际意义的字段,具有“意义更改”的可能性,比如订单编号在刚开始的时候我们一切顺利,后来客户说“订单可以作废,并重新生成订单,而且订单号要保持原订单号一致”,这样原来的主键就面临危险了。因此,具有唯一性的实际字段也代表可以作为主键。因此,我推荐是新设一个字段专门用为主键,此主键本身在业务逻辑上不体现,不具有实际意义。而这种主键在一定程序增加了复杂度,所以要视实际系统的规模大小而定,对于小项目,以后扩展不会很大的话,也查允许用实际唯一的字段作主键的。 

1.主键约束: 一个表只能有一个主键约束。主键可以是单个字段,也可以是多个字段。无论是哪种情况,其所有字段都是NOT NULL。

2.Unique约束:一个表可以有多个Unique约束,Unique的字段可以为NULL。

3.主键与Unique:不同点在于一个表只能有一个主键约束,但是可以有多个Unique约束;主键所有字段都是not null,unique可以是null。相同点在于都能保证唯一性。

4.主键、Unique与索引:主键约束与Unique约束默认会成为索引。当主键和Unique有多个字段时,有索引前缀性问题,即where语句中的条件必须有主键或者unique的第一个字段,否则不会使用索引。

5. 外键与主键、Unique:外键必须为另外一张表(父表)的主键或者唯一索引。如果要添加记录,而父表中没有则报错。反之,如果要删除父表中的记录,而子表中有记录,也会报错。但是如果在创建外键约束时,如果使用on delete cascade,则删除父表中数据时,不报错而直接把子表关联的数据删除。如果要删除父表,则需要加上cascade constraints,此时子表的foreign key被去除,表中记录保持不变。
--标红色的部分是外企的一道DBA面试题。其实主键约束和unique约束的区别也可以出一道题。
楼上的几位都解释了主键的作用,我主要说下设和不设有啥区别:
比如:
张三的身份证号为123456
李四的身份证号为012345
设置身份证号为主键后,那么数据库就约束你身份证号不能重复,不能为空,那么:
你向数据库表插入王五的身份证号为123456,则提示你主键不能重复之类的错误;
也许你要问,那就是保证不重复吗?主键可以保证不重复,并且不能为空,如果仅仅保证不重复的效果,可以只设置为索引就行了;
最后,主键可以是单字段主键,也可以2个或多个字段合并在一起形成联合主键。

example:外键必须是主键的所有列

create table test1 
(
   ID1                   NUMBER               NOT NULL,
   ID2                   NUMBER               not null,

   CONSTRAINT PK_STATE_UI_MAP_MAPPING PRIMARY KEY (ID1,ID2)
);

create table test2
(
   ID3                   NUMBER               NOT NULL,
   ID4                   NUMBER               not null,

   CONSTRAINT xxx Foreign KEY (ID3) REFERENCES test1 (ID1)  //wrong
   CONSTRAINT xxx Foreign KEY (ID3,ID4) REFERENCES test1 (ID1,ID2));//right

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics