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


    约束是数据库完整性的保证,主要分为:主键/外键/唯一键/默认值/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,删除存在约束的字段的时候,无需先删除约束,直接删除字段即可

    总结

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

  • 相关阅读:
    # 机器学习算法总结-第七天(线性回归)
    # 机器学习算法总结-第六天(Adaboost算法)
    # 机器学习算法总结-第五天(降维算法PCA/SVD)
    #再谈 CVE-2017-10271回显POC构造
    # 机器学习算法总结-第四天(SKlearn/数据处理and特征工程)
    # 机器学习算法总结-第三天(支持向量机)
    # 机器学习算法总结-第二天(朴素贝叶斯、逻辑回归)
    # 机器学习算法总结-第一天(KNN、决策树)
    # weblogic CVE-2019-2615/2618(任意文件读取,任意文件上传)
    # CVE-2019-2725二次反序列化EventData Gadget POC/JdbcRowSetImpl POC构造
  • 原文地址:https://www.cnblogs.com/wy123/p/9205079.html
Copyright © 2020-2023  润新知