SQLServer与MySQL约束/索引命名的一些差别总结

约束是数据库完整性的保证,主要分为:主键/外键/惟一键/默认值/check等类别,
约束是一个逻辑概念,表示数据的某些特性(不能为空,惟一,必须知足某些条件等等),索引是一个逻辑与物理概念的结合,逻辑上是一种数据结构,物理上要占用实实在在的存储空间。
对于主键和惟一键约束,在sqlserver中会自动生成惟一索引,sqlserver中的约束和索引是两个不一样的对象,约束就是约束,索引就是索引,主键/惟一约束经过主键/惟一索引实现。
在MySQL中更为直接,对于主键和惟一键,直接定义其primary key和unique key的索引属性便可
在SQL Server和MySQL中,约束与索引在生成的时候,有各自不一样的规则和命名方式,如下简单介绍在两种数据库中的特色和差别,以及我的的建议。sql

在SQL Server中的约束与索引:数据库

CREATE TABLE TestTable1
(
  --1,系统会默认对主键/惟一约束建立主键/惟一索引,索引的名字会与约束的名字一致
  Id int identity(1,1) not null constraint pk_Id primary key (Id),
  Name varchar(100) constraint uq_testtable1_name unique,
  --2,对主键/惟一约束,若是没有指定约束的名字,按照某种规则+随机生成索引名字
  Alias varchar (100) unique,
  CreateDate datetime not null constraint df_createdate default getdate(),
  --3,对于非空约束,无论是否指定了约束的名称,系统都不会为NOT NULL约束生成约束的名字
  LastUpdate datetime constraint notnullconstraint not null
)数据结构

1,系统会默认对主键/惟一约束建立主键/惟一索引,索引的名字会与约束的名字一致
2,对主键/惟一约束,若是没有指定约束的名字,按照某种规则+随机的方式生成索引名字
3,对于非空约束,无论是否指定了约束的名称,系统都不会为NOT NULL约束生成约束的名字
4,约束或者索引的名字,在数据库级别是惟一的,也就是说A表的约束的名字不能跟B表的约束采用同一个名字,对于索引,是表级别惟一的。
5,在sqlserver中,若是删除一个存在约束的字段,必需要先删除约束,不然报错,参考下图
      若是让约束随机命名,删除约束的时候会比较麻烦,因此建议对于约束要显式命名,sqlserver中,无论是对于约束或者索引,都强烈建议使用显式指定名字的方式命名,不使用系统默认生成的(随机)名字ide

 

 

在MySQL中的约束与索引sqlserver

CREATE TABLE TestTable1
(
  Id int auto_increment not null ,
  Name varchar(100) ,
  Alias varchar (100) ,
  CreateDate datetime not null default now(),
  LastUpdate datetime,
  spa

  primary key (Id),
  unique key uq_TestTable1_name(Name),
  unique key (Alias),
  key (Name,CreateDate)
 );server

对应的约束信息对象

 

对应的索引信息blog

1,系统会默认对主键/惟一约束建立主键/惟一索引,
  对于主键约束,无论是否显式给予命名,系统都会忽略这个主键名字,使用PRIMARY替代
  对于非主键约束,若是显式给予命名,系统会采用这个命名,不然使用字段名来当作索引的名字
2,MySQL中,索引的名字仅限于表级别不重复,库级别无要求,
  也就是说一个库中不一样的表,可使用相同的索引名称,固然这里并非建议或者支持这种方式的使用
3,对于非空约束,系统都不会为NOT NULL约束生成约束的名字
4,对于复合索引(多个字段组成),若是没有显式命名,会采用第一个字段命名
  从这一点来看,未显式命名的状况下,没法作到见名知意,
  也就是说看到索引的名字可以大概知道是一个什么字段的索引,所以在MySQL中,对于非主键索引,建议使用显式命名的方式进行管理
5,删除存在约束的字段的时候,无需先删除约束,直接删除字段便可
索引

总结

  无论是在哪一种数据库中,对于数据库中某些自定义的对象的命名方式,你不主动作选择就会被默认,被默认就意味着颇有多是被动的。  既有默认值也有自定义的状况下,自动生成的默认的命名每每不利于维护或者没法作到见名知意,  在符合规则的前提下,尽量地去作到自定义(主动而不是被动),以便于后期的维护和管理。

相关文章
相关标签/搜索