精华内容
下载资源
问答
  • 1、表识列(identity):数据类型必须为整型 2、非空约束(not null):列值是否允许为空 3、主键约束(primary key):主键是能够唯一标识一条记录键 允许为空,主键不允许又重复值 ...后五种可以在..

    1、表识列(identity):数据类型必须为整型

    2、非空约束(not null):列值是否允许为空

    3、主键约束(primary key):主键是能够唯一标识一条记录的键  允许为空,主键不允许又重复的值

    4、唯一约束(unique):不允许有重复的值,但可以是空值

    5、检查约束(check)检查字段约束是否符合规定的规则

    6、默认约束(default)为字段添加默认值

    7、外键约束(foreign key)删除主键表前,先删除外键表 

    注:前两种只能在建表的时候使用约束。

    后五种可以在建表是创建,也可以在建表后添加。

     

     

    添加约束的语法:

    alter table [表名]

    add constraint [约束名] [约束类型] [具体的约束说明]

    删除约束的语法:

    alter table [表名]

    drop constraint [约束名]

     

     

    展开全文
  • 泛型是什么五种类型约束 派生约束 常见的 约束放在类的实际派生之后 可以继承一个基类和多个接口且基类在接口前面 构造函数约束 常见的 约束组合 值约束 常见的 接口约束同时使用 引用约束常见的 多个...



     

    泛型是什么?

    通过上篇的实例  C# 泛型约束 xxx<T> Where T:约束(一),我们对泛型有一定的认识。

    所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。

    在定义泛型类时,可以对代码能够在实例化类时用于类型参数的类型种类施加限制。如果代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。

    五种类型的约束

    下表列出了五种类型的约束:

    约束 说明
    T:struct 类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。
    T:class 类型参数必须是引用类型,包括任何类、接口、委托或数组类型。
    T:new () 类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
    T:<基类名> 类型参数必须是指定的基类或派生自指定的基类。
    T:<接口名称> 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
    T:U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束.

    image

    1. 派生约束

    1.常见的

    public class MyClass5<T> where T :IComparable { }

    2.约束放在类的实际派生之后

    public class B { }

    public class MyClass6<T> : B where T : IComparable { }

    3.可以继承一个基类和多个接口,且基类在接口前面

    public class B { }

    public class MyClass7<T> where T : B, IComparable, ICloneable { }

    2. 构造函数约束

    1.常见的

    public class MyClass8<T> where T :  new() { }

    2.约束组合

    可以将构造函数约束和派生约束组合起来,前提是构造函数约束出现在约束列表的最后

    public class MyClass8<T> where T : IComparable, new() { }

    3. 值约束

    1.常见的

    public class MyClass9<T> where T : struct { }

    2. 接口约束同时使用

    与接口约束同时使用,在最前面(不能与基类约束,构造函数约束一起使用)

    public class MyClass11<T> where T : struct, IComparable { }

    4. 引用约束

    1.常见的

    public class MyClass10<T> where T : class { }

    5. 多个泛型参数

    public class MyClass12<T, U> where T : IComparable  where U : class { }

    6. 继承和泛型

    public class B<T>{ }

    1.类型实参

    1. 在从泛型基类派生时,可以提供类型实参,而不是基类泛型参数

        public class SubClass11 : B<int>{ }

    2.子类泛型作为基类泛型的指定类型

    2.如果子类是泛型,而非具体的类型实参,则可以使用子类泛型参数作为泛型基类的指定类型

        public class SubClass12<R> : B<R>{ }

    3.子类重复基类的约束

    3.在子类重复基类的约束(在使用子类泛型参数时,必须在子类级别重复在基类级别规定的任何约束)
        public class B<T> where T : ISomeInterface { }
        public class SubClass2<T> : B<T> where T : ISomeInterface { }

    4.构造函数约束

    复制代码
    public class B<T> where T : new()
    {
        public T SomeMethod()
        {
            return new T();
        }
    }
    public class SubClass3<T> : B<T> where T : new() { }
    复制代码

     

    7. 泛型方法

    C#2.0泛型机制支持在"方法声名上包含类型参数",这就是泛型方法)

    1.泛型类型/非泛型类型

    泛型方法既可以包含在泛型类型中,又可以包含在非泛型类型中

    public class MyClass5
    {
        public void MyMethod<T>(T t){ }
    }

    2.泛型方法的声明与调用

    复制代码
    public class MyClass5
    {
        public void MyMethod<T>(T t)
        {
        }
    }
    
    public class App5
    {
        public void CallMethod()
        {
            MyClass5 myclass5 = new MyClass5();
            myclass5.MyMethod<int>(3);
        }
    }
    复制代码

    3.泛型方法的重载

    复制代码
    //第一组重载
    void MyMethod1<T>(T t, int i) { }
    
    void MyMethod1<U>(U u, int i) { }
    
    //第二组重载
    void MyMethod2<T>(int i) { }
    void MyMethod2(int i) { }
    
    //第三组重载,假设有两个泛型参数
    void MyMethod3<T>(T t) where T : A { }
    void MyMethod3<T>(T t) where T : B { }
    
    //第四组重载
    
    public class MyClass8<T, U>
    {
        public T MyMothed(T a, U b)
        {
            return a;
        }
        public T MyMothed(U a, T b)
        {
            return b;
        }
        public int MyMothed(int a, int b)
        {
            return a + b;
        }
    }
    复制代码

    4.泛型方法的覆写

    复制代码
    public class MyBaseClass1
    {
        public virtual void MyMothed<T>(T t) where T : new() { }
    }
    public class MySubClass1 : MyBaseClass1
    {
        //不能重复任何约束
        public override void MyMothed<T>(T t) { }
    }
    
    public class MyBaseClass2
    {
        public virtual void MyMothed<T>(T t){ }
    }
    public class MySubClass2 : MyBaseClass2
    {
        //重新定义泛型参数T
        public override void MyMothed<T>(T t){ }
    }
    复制代码

    8. 虚拟方法

    复制代码
    public class BaseClass4<T>
    {
        public virtual T SomeMethod()
        {
            return default(T);
        }
    }
    public class SubClass4 : BaseClass4<int> //使用实参继承的时候方法要使用实参的类型
    {
        public override int SomeMethod()
        {
            return 0;
        }
    }
    
    public class SubClass5<T> : BaseClass4<T> //使用泛型继承时,方法也是泛型
    {
        public override T SomeMethod()
        {
            return default(T);
        }
    }
    复制代码

    9. 泛型参数强制转换到Object或约束指定的类型

    编译器只允许将泛型参数隐式强制转换到 Object 或约束指定的类型

    复制代码
    class MyClass<T> where T : BaseClass, ISomeInterface
    {
        void SomeMethod(T t)
        {
            ISomeInterface obj1 = t;
            BaseClass obj2 = t;
            object obj3 = t;
        }
    }
    
    //变通方法:使用临时的 Object 变量,将泛型参数强制转换到其他任何类型
    
    class MyClass2<T>
    {
        void SomeMethod(T t)
        {
            object temp = t;
            BaseClass obj = (BaseClass)temp;
        }
    }
    复制代码

    10. 泛型参数强制转换到其他任何接口

    编译器允许您将泛型参数显式强制转换到其他任何接口,但不能将其转换到类

    复制代码
    class MyClass1<T>
    {
        void SomeMethod(T t)
        {
            ISomeInterface obj1 = (ISomeInterface)t;
            //BaseClass obj2 = (BaseClass)t;           //不能通过编译
        }
    }
    复制代码

    11. 泛型参数强制转换到其他任何类型

    使用临时的 Object 变量,将泛型参数强制转换到其他任何类型

    复制代码
    class MyClass2<T>
    {
        void SomeMethod(T t)
        {
            object temp = t;
            BaseClass obj = (BaseClass)temp;
        }
    }
    复制代码

    12. 使用is和as运算符

    复制代码
    public class MyClass3<T>
    {
        public void SomeMethod(T t)
        {
            if (t is int) { }
            if (t is LinkedList<int>) { }
            string str = t as string;
            if (str != null) { }
            LinkedList<int> list = t as LinkedList<int>;
            if (list != null) { }
        }
    }
    复制代码

    参考资料

    MSDN:http://msdn.microsoft.com/zh-cn/library/d5x73970.aspx

    部分内容参考:http://www.cnblogs.com/andrew-blog/archive/2012/03/21/ListT_Where.html

    作者:赵青青        出处:http://www.cnblogs.com/zhaoqingqing/
    关于我:乐于学习未知技术和知识,擅长Unity3D,游戏开发,.NET等领域。
    本文版权归作者和博客园共有欢迎转载,转载之后请务必在文章明显位置标出原文链接和作者,谢谢。
    如果本文对您有帮助,请点击【推荐】您的赞赏将鼓励我继续创作!想跟我一起进步么?那就【关注】我吧。
    posted @ 2014-08-06 12:00 赵青青 阅读(1186) 评论(...) 编辑 收藏

    本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/3894229.html,如需转载请自行联系原作者
    展开全文
  • Oracle提供了五种索引扫描类型,根据具体索引类型、数据分布、约束条件以及where限制不同进行选择: 索引唯一扫描(index unique scan) 索引范围扫描(index range scan) 索引全扫描(index full scan) 索引快速...

    目录

    一、简介

    二、索引唯一扫描

    三、索引范围扫描

     四、索引全扫描

    五、索引快速全扫描

    六、索引跳跃式扫描

     七、总结

    一、简介

    Oracle提供了五种索引扫描类型,根据具体索引类型、数据分布、约束条件以及where限制的不同进行选择:

    1. 索引唯一扫描(index unique scan)
    2. 索引范围扫描(index range scan)
    3. 索引全扫描(index full scan)
    4. 索引快速扫描(index fast full scan)
    5. 索引跳跃扫描(index skip scan)

    下面我们依次对每种方式进行详细的说明。

    二、索引唯一扫描

    简称:index unique scan

    通过唯一索引查找一个数值经常返回单个ROWID。如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导列参与到该查询中。

    如创建一个索引:

    create index idx_test on emp(ename, deptno, loc)

    则下面的语句可以使用该索引:

    select ename from emp where ename = ‘JACK’ and deptno = ‘DEV’

    如果该语句只返回一行,则存取方法称为索引唯一扫描。但是注意下面的语句不会使用该索引,因为where子句种没有引导列。

    select ename from emp where deptno = ‘DEV’

    如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话,Oracle经常实现唯一性扫描,索引唯一性扫描的结果最多返回一条记录。

    下面通过一个简单的示例说明索引唯一扫描的场景:

    【a】表结构说明:RWID、XSID、CPHJID三个字段组成组合唯一索引

    【b】SQL语句 : 使用到了组合索引的三个字段,显然这三个字段组合起来能够唯一确定一条数据,所以使用到了索引唯一扫描。

    explain plan for select * from zhxg_zhcp_hjcpxq t where 
     t.rwid = '6d5ca4e1-fe93-4447-933a-e9ae5cb9cf31'
      and t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1' 
     and t.cphjid = '529e35bc-1e24-4dc9-ad0e-930c4372e40f';
    select * from table(dbms_xplan.display);

    【c】SQL执行计划

    三、索引范围扫描

    简称:index range scan

    1. 索引是组合索引,而且select ename from emp where ename = ‘JACK’ and deptno = ‘DEV’语句返回多行数据,虽然该语句还是使用该组合索引进行查询,可此时的存取方法称为索引范围扫描。
    2. 当扫描对象是唯一性索引时,此时目标sql的where条件一定是范围查询(如between..and...、>、<、<>、>=、<=等);
    3. 当扫描对象是非唯一性索引时,此时目标sql的where条件没有限制(可以是等值,也可以是范围查询)

    下面通过一个简单的示例说明索引范围扫描的场景: 

    explain plan for select * from vc_zhxg_xsxx_xsjbxx;
    
    select * from table(dbms_xplan.display);

    【a】表结构说明

    【b】执行计划

    【c】索引范围扫描小总结:

    使用index rang scan的3种情况:

    • (a) 在唯一索引列上使用了range操作符(> < <> >= <= between);
    • (b) 在组合索引上,只使用部分列进行查询,导致查询出多行;
    • (c) 对非唯一索引列上进行的任何查询;

     四、索引全扫描

    简称:index full scan

    与全表扫描TABLE ACCESS FULL对应,也有相应的全Oracle索引扫描。在某些情况下,可能进行全Oracle索引扫描而不是范围扫描,需要注意的是全Oracle索引扫描只在CBO模式下才有效。 CBO根据统计数值得知进行全Oracle索引扫描比进行全表扫描更有效时,才进行全Oracle索引扫描,而且此时查询出的数据都必须从索引中可以直接得到。

    下面通过一个简单的示例说明索引全扫描的场景: 

    【a】表结构说明:ND、XSID两个字段组成组合唯一索引

    【b】SQL语句 : 注意order by t.nd, t.xsid

    explain plan for select * from zhxg_lx_jcsj_lxxsgl t order by t.nd,t.xsid;
    
    select * from table(dbms_xplan.display);

    【c】执行计划

    五、索引快速全扫描

    简称:index fast full scan

    扫描索引中的所有的数据块,与 index full scan很类似,但是一个显著的区别就是它不对查询出的数据进行排序,即数据不是以排序顺序被返回。在这种存取方法中,可以使用多块读功能,也可以使用并行读入,以便获得最大吞吐量与缩短执行时间。

    注意点:

    索引快速全扫描的执行结果不一定是有序的。这是因为索引快速全扫描时Oracle是根据索引行在磁盘上的物理存储顺序来扫描,而不是根据索引行的逻辑顺序来扫描的,所以扫描结果才不一定有序(对于单个索引叶子块中的索引行而言,其物理存储顺序和逻辑存储顺序一致;但对于物理存储位置相邻的索引叶子块而言,块与块之间索引行的物理存储顺序则不一定在逻辑上有序)。

    下面通过一个简单的示例说明索引快速全扫描的场景: 

    【a】表结构说明:

    【b】SQL语句 

    explain plan for select nd,xsid from zhxg_lx_jcsj_lxxsgl t;
    
    select * from table(dbms_xplan.display);

    【c】执行计划

    六、索引跳跃式扫描

    简称:INDEX SKIP SCAN

    主要发生在多个列建立的组合索引上,如果SQL中谓词条件只包含索引中的部分列,并且这些列不是建立索引时的第一列时,就可能发生INDEX SKIP SCAN。这里SKIP的意思是因为查询条件没有第一列或前面几列,被忽略了。

    下面通过一个简单的示例说明索引跳跃式扫描的场景: 

    【a】表结构说明:RWID、XSID、CPHJID三个字段组成一个唯一组合索引

     

     【b】SQL语句:使用到了索引列的第一列RWID和第二列XSID

    explain plan for select * from zhxg_zhcp_hjcpxq t where 
     t.rwid = '6d5ca4e1-fe93-4447-933a-e9ae5cb9cf31'
      and t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1';
    select * from table(dbms_xplan.display);

    【c】执行计划:很显然,肯定走索引,而且是索引范围扫描

    观察下面的SQL,使用到了RWID、XSID、CPHJID三个索引,显然三者组合唯一,使用到唯一索引扫描。

    explain plan for select * from zhxg_zhcp_hjcpxq t where 
     t.rwid = '6d5ca4e1-fe93-4447-933a-e9ae5cb9cf31'
      and t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1' 
     and t.cphjid = '529e35bc-1e24-4dc9-ad0e-930c4372e40f';
    select * from table(dbms_xplan.display);

    再观察下面的SQL,使用到组合索引的第二列XSID和第三列CPHJID,注意到这里跳过了第一列引导列索引RWID,这其实就是索引跳跃现象,显然使用到的就是索引跳跃式扫描,在开发中我们应尽量避免出现索引跳跃。

    explain plan for select * from zhxg_zhcp_hjcpxq t where 
     t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1' 
     and t.cphjid = '529e35bc-1e24-4dc9-ad0e-930c4372e40f';
    select * from table(dbms_xplan.display);

     七、总结

    以上就是关于Oracle中常见的五种索引扫描方式的总结,主要注意下面几点,能有效提高SQL查询效率。

    1. 尽可能使SQL走唯一索引扫描和索引范围扫描;
    2. 至于索引全扫描可能遇到的较少些,一般出现了再具体分析下;
    3. 尽量避免出现索引跳跃现象,尽量满足Oracle索引最左前缀匹配原则;

    参考资料:

    https://www.cnblogs.com/zwl715/p/3601137.html

    https://blog.csdn.net/choubei6141/article/details/100741178

    https://www.cnblogs.com/yumiko/p/5972246.html

    展开全文
  • 最后,本章还将介绍一更安全方法来替代不受限制强制类型转换。 第16章:string类和标准模板库 本章将讨论C++语言中新增一些类库。对于传统C-风格字符串来说,string类是一方便且功能强大 替代...
  • 最后,本章还将介绍一更安全方法来替代不受限制强制类型转换。 第16章:string类和标准模板库 本章将讨论C++语言中新增一些类库。对于传统C-风格字符串来说,string类是一方便且功能强大 替代...
  • 最后,本章还将介绍一更安全方法来替代不受限制强制类型转换。 第16章:string类和标准模板库 本章将讨论C++语言中新增一些类库。对于传统C-风格字符串来说,string类是一方便且功能强大 替代...
  • 4.4.3 实体中出现所有实体类型都必须不同 106 4.4.4 第一范式所避免不规则编程 106 4.4.5 当前设计不符合第一范式线索 110 4.5 属性间关系 111 4.5.1 第二范式 111 4.5.2 第三范式 116 4.5.3 Boyce-...
  • 4.2 维护数据完整性的五种方式的举例说明 4.3 建立主键的五种不同方式 4.4 完整性约束的习题讲解 4.5 给已有表添加、删除约束的方法 第5部分 Oracle11g的网络配置 5.1 Oracle11g的网络连接方式 ...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 6.1 隐式类型转换 .48 6.2 显式类型转换 .53 6.3 小 结 .56 第七章 表 达 式 .58 7.1 操 作 符 .58 ...
  • C#微软培训资料

    2014-01-22 14:10:17
    章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 6.1 隐式类型转换 .48 6.2 显式类型转换 .53 6.3 小 结 .56 第七章 表 达 式 .58 7.1 操 作 符 .58 ...
  • 还涉及到软件系统目标、软件系统提供服务、软件系统的约束和软件系统运行环境。它还涉及到这些因素和系统精确规格说明,以及系统进化之间关系。 需求分析基本任务包括: (1) 抽取需求 分析现行系统...
  • asp.net知识库

    2015-06-18 08:45:45
    常见的 ASP.NET 2.0 转换问题和解决方案 Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1) -- 异步WebService调用 ASP.NET 2.0页面框架的几点新功能 ASP.NET 2.0 中收集的小功能点 asp.net2.0中的webpart使用...
  • 8.2.5 其他数据表类型 124 8.2.6 数据表文件 125 8.3 MySQL数据类型 126 8.3.1 整数(xxxINT) 126 8.3.2 定点数(DECIMAL) 127 8.3.3 日期与时间(DATE、TIME、DATETIME、TIMESTAMP) 128 8.3.4 字符串...
  • 常见的数据模型 1. 层次结构模型: 层次结构模型实质上是一有根结点的定向有序树,IMS(Information Manage-mentSystem)是其典型代表。 2. 网状结构模型:按照网状数据结构建立的数据库系统称为网状数据库系统,其...
  • (42) 希尔排序法属于哪一种类型的排序法(B) A.交换类排序法 B.插入类排序法 C.选择类排序法 D.建堆排序法 (43) 在深度为5满二叉树中,叶子结点个数为(C) A. 32 B. 31 C. 16 D. 15 (44) 对长度为N线性表进行...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    统一建模语言是一通用可视化建模语言,用于对软件系统制品进行规范化、可视化处理,然后构造它们并建立它们文档。 UML发展过程 图 与 语言 谁一级棒? UML优势 过去数十面向对象建模语言各自为战...
  • (40) 数据库管理系统常见的数据模型有层次模型、网状模型和______三。 答:关系模型 (1) 下面叙述正确的是______。(C) A. 算法的执行效率与数据的存储结构无关 B. 算法的空间复杂度是指算法程序中指令(或语句)...
  • 书中内容主要集中在大多数企业常见的问题之上,如安装和升级到oracle database 11g数据库软件、创建数据库、导出和导入数据、数据库的备份与恢复、性能调优,等等。  本书还提供了dba完成本职工作必备的基本的uniix...
  •  Java 常见的 10 余设计模式,全 23 设计模式逐步更新 Java Web  包含 Servlet & JSP、Spring、SpringMVC、Mybatis、Hibernate、Structs2 核心思想,如 IOC、AOP 等思想。SSM 更详细请转向:Spring | ...
  • 在此Repo中,我们展示了如何用 PaddlePaddle来解决常见的机器学习任务,提供若干不同的易学易用的神经网络模型。PaddlePaddle用户可领取免费Tesla V100在线算力资源,高效训练模型,每日登陆即送12小时,连续天...
  • 14.7.5 函数传参实例——判断数组排列方式后执行不同函数 247 14.8 数组在对象中传参 249 14.9 数组对象 250 14.10 在数组对象中初始化成员变量 251 14.11 指针数组 252 14.12 枚举常量与数组.. 257 ...
  • java面试题典 java 面试题 经典

    热门讨论 2010-06-18 13:42:36
    JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? 14 42. java中会存在内存泄漏吗,请简单描述。 14 43. java中实现多态机制是什么? 14 44. 垃圾回收器基本原理是什么?垃圾回收器可以...
  • 6.6 定义:参与者种类型 6.7 表示法:用例常用形式 6.8 示例:详述风格处理销售 6.9 各小节含义 6.10 表示法:有其他格式吗?两栏变体 6.11 准则:以无用户界面约束的本质风格编写用例 6.12 ...
  • 68.对企业物流系统建设项目进行综合指标比较评价时,若采用加权因素比较法,其常见的评价因素通常包括( )等。 A.运输效率 B.物流效率 C.适应性和通用性 D.场地利用率 E.设备利用率 69.物流成本控制的...
  • 6.3.3 使用Spinner Widget下拉列表约束用户输入 119 6.4 使用按钮、多选框和单选组 121 6.4.1 使用基本按钮 122 6.4.2 使用多选框和Toggle按钮 123 6.4.3 使用RadioGroup和RadioButton 124 6.5 获取...
  • 今天讲MySQL中的数据类型,在MySQL中常见的数据类型有以下五种: 数字 类型 大小 有符号 无符号 unsigned约束 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0...

    在MySQL中数据类型有以下五种:

    数字

    类型 大小 有符号 无符号 unsigned约束 用途
    TINYINT 1 字节 (-128,127) (0,255) 小整数值
    SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
    MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
    INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
    BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
    FLOAT 4 字节float(255,30) (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
    DOUBLE 8 字节double(255,30) (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
    DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2double(65,30) 依赖于M和D的值 依赖于M和D的值 小数值

    整数:
    常用的有2种,一是int型,int型最多可以表示10位数字(无符号的4开头,有符号的2开头;二是tinyint unsigned,用来表示年龄(值范围是0-255)。

    小数:
    注意float(m,n)表示法中的m表示数字总共有m位,n表示小数有n位,那么整数部分只能有m-n位。
    float默认保留5位小数、double默认保留16位小数、decimal默认是10位数字不含小数(它的最大范围是65位数字,其中小数可以保留30位)。

    时间

    表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

    每个时间类型有一个有效值范围和一个"零"值,当指定不合法的MySQL不能表示的值时系统会将其更正为"零"值。

    TIMESTAMP类型有专有的自动更新特性,将在后面描述。

    类型 大小 范围 格式 用途
    DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 年月日
    TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时分秒
    YEAR 1 1901/2155 YYYY 年份值
    DATETIME 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 年月日时分秒
    TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳

    时间类型可以增加限定属性:

    not null 非空

    default current_timestamp 默认时间为当前时间

    on update current_timestamp 更新数据时自动更新当前时间

    date:用来记录各种日期,如出生日期、入职日期等关注日期而不关注时间的等信息。

    time:用来记录时间安排(课程表、日程表)的信息、时长的等信息。

    datetime:用户登录时间等

    字符串

    类型 大小 用途
    CHAR 0-255字节 定长字符串
    VARCHAR 0-65535 字节 变长字符串
    TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
    TINYTEXT 0-255字节 短文本字符串
    BLOB 0-65535字节 二进制形式的长文本数据
    TEXT 0-65535字节 长文本数据
    MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
    MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
    LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
    LONGTEXT 0-4 294 967 295字节 极大文本数据

    以上类型中char和varchar类型用得最多。

    char类型为定长字符型,长度固定为声明的长度,范围是0-255字符数(注意不是字节数!使用utf8编码中文会占3个字节,也就是说255个中文字符实际上会占用765字节)。存储时数据长度不够声明的长度时末尾会被填充空格,取值时会舍弃末尾的空格部分,数据超过声明长度的部分会被舍弃。适合使用char类型的如身份证号、手机号、qq号、用户名、密码、银行卡号等。

    varchar类型为不定长字符型,长度不固定但最长不能超过声明的长度,范围是0-65535字符数。存储时数据长度不够声明的长度时不会填充空格,数据最后会附加2个字节的长度信息,数据超过声明长度的部分会被舍弃。适合使用varchar类型的如评论、朋友圈、微博等。

    char类型优点是检索速度快,缺点是浪费存储空间;varchar类型优点是节省存储空间,缺点是检索速度慢。
    由于现在存储空间不再是瓶颈,所以在强调检索速度的场景优先使用char,只有在不确定字符串长度又不强调检索速度的场景才使用varchar。

    enum单选

    案例:

    在下面的sql语句中创建了test表,它的gender字段约束了数据只能是’male’或’female’。

    create table test(id int,name char(18),gender enum('male','female'));
    

    如果该字段输其它内容会报错并导致整条数据不能存入数据库。如下面这条语句就会报错且数据不会保存到数据库。

    insert into test values(1,'mike','不详');
    

    只有输入正确的选项数据才能存入数据库。

    insert into test values(1,'mike','male');
    

    set多选

    案例:

    在下面的sql语句中创建了test表,它的hobby字段约束了数据只能从列表中选择’。

    create table test(id int,name char(18),hobby set('抽烟','喝酒','烫头','洗脚'));
    

    如果该字段输其它内容会报错并导致整条数据不能存入数据库。如下面这条语句就会报错且数据不会保存到数据库。

    insert into test values (1,'mike','烫头,喝酒,抽烟,按摩’);
    

    只有输入正确的选项数据才能存入数据库。

    insert into test values (1,'mike','烫头,喝酒,抽烟');
    

    注意上述多选中整个选项作为一个字符串且选项之间用英文逗号隔开。

    展开全文

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

常见的五种约束类型