欢迎来到天天文库
浏览记录
ID:50370055
大小:30.97 KB
页数:3页
时间:2020-03-08
《mysql主键设置原则.docx》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、学习MySQL数据库,MySQL主键是不能不提到的,下面就对MySQL主键的设计原则进行说明,希望能让您对MySQL主键有更深的认识。关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途:1.惟一地标识一行。2.作为一个可以被外键有效引用的对象。基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:1.MySQL主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。2.MySQL主键应该是单列的,以便提高连接和筛选操作的效率。注:使用复合键的人通
2、常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。3.永远也不要更新MySQL主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所
3、以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。4.MySQL主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。5.MySQL主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。主键自动增长在Mysql,SqlServer,Oracle中的设置1、把主键定义
4、为自动增长标识符类型在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。例如:createtablecustomers(idintauto_incrementprimarykeynotnull,namevarchar(15));insertintocustomers(name)values("name1"),("name2");selectidfromcustomers;以上sql语句先创建了customers表,然后插入两条记录,在插入时仅仅设定了name字段的值。最后查询表中id字段,查询结果为:id12由此可见,一旦
5、把id设为auto_increment类型,mysql数据库会自动按递增的方式为主键赋值。在MSSQLServer中,如果把表的主键设为identity类型,数据库就会自动为主键赋值。例如:createtablecustomers(idintidentity(1,1)primarykeynotnull,namevarchar(15));insertintocustomers(name)values("name1"),("name2");selectidfromcustomers;查询结果和mysql的一样。由此可见,一旦把id设为identity类型,MSSQLS
6、erver数据库会自动按递增的方式为主键赋值。identity包含两个参数,第一个参数表示起始值,第二个参数表示增量。2、从序列中获取自动增长的标识符在Oracle中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符,把它赋值给主键。例如一下语句创建了一个名为customer_id_seq的序列,这个序列的起始值为1,增量为2。createsequencecustomer_id_seqincrementby2startwith1一旦定义了customer_id_seq序列,就可以访问序列的curval和nextval属性。curval:返
7、回序列的当前值nextval:先增加序列的值,然后返回序列值以下sql语句先创建了customers表,然后插入两条记录,在插入时设定了id和name字段的值,其中id字段的值来自于customer_id_seq序列。最后查询customers表中的id字段。createtablecustomers(idintprimarykeynotnull,namevarchar(15));insertintocustomersvalues(customer_id_seq.curval,"name1"),(customer_id_seq.nextval,"name2");se
8、lecti
此文档下载收益归作者所有