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

在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中,不管是对于约束或者索引,都强烈建议使用显式指定名字的方式命名,不使用系统默认生成的(随机)名字

在MySQL中的约束与索引

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

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

对应的约束信息

对应的索引信息

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

总结

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

SQLServer与MySQL约束/索引命名的一些差异总结的更多相关文章

  1. [转]mysql联合索引

    mysql联合索引   命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 https:/ ...

  2. B-Tree索引在sqlserver和mysql中的应用

    在谈论数据库性能优化的时候,通常都会提到“索引”,但很多人其实并没有真正理解索引,也没有搞清楚索引为什么就能加快检索速度,以至于在实践中并不能很好的应用索引.事实上,索引是一种廉价而且十分有效的优化手 ...

  3. MySql SqlServer Sqlite中关于索引的创建

    最近要更新Cocon90.Db库,令其ORM创建表时实现索引的添加.因此总结下列常用Sql,供大家学习与参考. 一.SqlServer中创建索引可以这样: ) Create Table Test ( ...

  4. SqlServer,Oracle,db2,MySql查询表索引

    SqlServer1. 查询表索引 SELECT 索引名称=a.name ,表名=c.name ,索引字段名=d.name ,索引字段位置=d.colid ,c.status FROM sysinde ...

  5. 活字格外联数据库SQLServer和Mysql的经验(大多数经验也适合其它使用外联数据库的平台)

    来自学习和实操后的总结,有说得不对的,或者遗漏的,大家留言补充.希望这个贴子,能成为活字格老铁们使用外联库的一个指南.PS即使你不打算使用外联库,里面的一些方法,也值得看一看! 一.库表规划1.系统表 ...

  6. 你搞懂 ORACLE、 SQLSERVER、MYSQL与DB2的区别了吗

    ORACLE. SQLSERVER.MYSQL与DB2的区别--平台性:    Oracle.MYSQL与DB2可在所有主流平台上运行:    SQL Server只能在Windows下运行: --安 ...

  7. MySQL中索引和优化的用法总结

    1.什么是数据库中的索引?索引有什么作用? 引入索引的目的是为了加快查询速度.如果数据量很大,大的查询要从硬盘加载数据到内存当中. 2.InnoDB中的索引原理是怎么样的? InnoDB是Mysql的 ...

  8. mysql联合索引

    命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 https://segmentfaul ...

  9. mysql:联合索引及优化

    命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 尽量不要用or,如果可以用union代 ...

随机推荐

  1. Java中List集合去除重复数据的方法

    1. 循环list中的所有元素然后删除重复 public static List removeDuplicate(List list) { for ( int i = 0 ; i < list. ...

  2. LOJ 2550 「JSOI2018」机器人——找规律+DP

    题目:https://loj.ac/problem/2550 只会写20分的搜索…… #include<cstdio> #include<cstring> #include&l ...

  3. Centos 7 安装图形化环境

    安装系统时,使用了最小化安装,当需要用到图形界面的时候需要安装图形界面支持 环境是centos7.5最小化安装 1,先更新系统 yum -y upgrade 这里说明一下upgrade和update的 ...

  4. servlet-response学习笔记

    为了给用户一个返回数据,我们需要使用HttpServletResponse 从相应对象获取一个输入流 通过输入流将返回结果写入到响应体中 关闭输入流 public class ResponseServ ...

  5. pandas学习笔记(一)

    Pandas是一款开放源码的BSD许可的Python库,为Python编程语言提供了高性能,易于使用的数据结构和数据分析工具.Pandas用于广泛的领域,包括金融,经济,统计,分析等学术和商业领域.在 ...

  6. Linux裸设备管理详解--

    裸设备概述 裸设备:也叫裸分区(原始分区),是一种没有经过格式化,不被Unix/Linux通过文件系统来读取的特殊字符设备.裸设备可以绑定一个分区,也可以绑定一个磁盘.字符设备:对字符设备的读写不需要 ...

  7. ntp服务

    ntp服务主要是用于对计算机的时间同步管理操作.时间是对服务器来说是很重要的,一般很多网站都需要读取服务器时间来记录相关信息,如果时间不准,则可能造成很大的影响,对于集群,也需要时间同步. 部署安装N ...

  8. mongoexport 导出需要授权数据库中的集合 报错 Authentication failed.

    当 mongo数据库启动服务时,使用了 认证机制,在使用mongoexport导出集合文件时,需要用户权限认证. 开启数据库认证服务: mongod --auth 导出mongo中集合文件: mong ...

  9. Windows环境下在sublime text3配置C编译环境

    1. 检查本机有没有安装GCC,没有的话先进行安装 2. 选择 sublime 的Tools->Build System->New Build System,建立配置文件,文件命名为C.s ...

  10. 接口测试总结分享(http与rpc)

    接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等. 一.了 ...