zoukankan      html  css  js  c++  java
  • TSQL--标示列、GUID 、序列


    --1. IDENTIY 列不能为空,不能设默认值,创建后不能使用ALTER TABLE TableName ALTER COLUMN修改,每张表只能有一个自增列
    --2. 查看当前值:SELECT IDENT_CURRENT('TableName'),
    --    查看增量值:SELECT IDENT_INCR('TableName')
    --    查看原始种子值:SELECT IDENT_SEED('TableName'),起始值, TRUNCATE TABLE 后的初始值。
    --3.  允许 显式 插入自增列:SET IDENTITY_INSERT TableName ON; 设置为ON后,允许当前回话对自增列插入时指定值,该设置只影响当前回话,并且同一回话中只允许同时修改一张表的IDENTITY_INSERT 属性,对其他表再次设置时会提示:”表 'XXX1' 的 IDENTITY_INSERT 已经为 ON。无法对表 'XXX2' 执行 SET 操作。“,在对自增列显式插入值后,会检查或修改自增列的当前值为整表中最大值。
    --4.  IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。 SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。@@IDENTITY能获取到由当前语句引发的触发器,内置存储过程等倒置的自增值。
    --如对表T1插入引发触发器对表T2也进行插入,@@IDENTITY得到T2的自增值,而SCOPE_IDENTITY获取当前作用域T1的自增值。

    --4. 如果要求值在所有表中唯一,可以使用UNIQUEIDENTIFIER,使用NEWID()来获得唯一值。
    --5. 为避免GUID作为聚簇索引照成的页面碎片和页拆分,可以使用NEWSEQUENTIALID()来获取自增的GUID:
    --   CREATE TABLE myTable (ColumnA uniqueidentifier DEFAULT NEWSEQUENTIALID())
    --  如果考虑安全性和保密性,建议不适用NEWSEQUENTIALID()
    --6. NEWSEQUENTIALID()只能针对表使用DEFAULT方式来实现。使用 NEWSEQUENTIALID() 生成的每个 GUID 在该计算机上都是唯一的。仅当源计算机具有网卡时,使用 NEWSEQUENTIALID() 生成的 
    --GUID 在多台计算机上才是唯一的
    --7.  序列,2012新特性,数据库级别对象,每次获取后自增。
    --=============================================
    --创建序列
    CREATE SEQUENCE [schema_name . ] sequence_name
        [ AS [ built_in_integer_type | user-defined_integer_type ] ]
        [ START WITH <constant> ]
        [ INCREMENT BY <constant> ]
        [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
        [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
        [ CYCLE | { NO CYCLE } ]
        [ { CACHE [ <constant> ] } | { NO CACHE } ]
        [ ; ]
    --=============================================
    --获取序列
     NEXT VALUE FOR [ database_name . ] [ schema_name . ]  sequence_name
       [ OVER (<over_order_by_clause>) ]
       
    --=============================================
    --获取范围的序列值
    sp_sequence_get_range [ @sequence_name = ] N'<sequence>' 
         , [ @range_size = ] range_size
         , [ @range_first_value = ] range_first_value OUTPUT 
        [, [ @range_last_value = ] range_last_value OUTPUT ]
        [, [ @range_cycle_count = ] range_cycle_count OUTPUT ]
        [, [ @sequence_increment = ] sequence_increment OUTPUT ]
        [, [ @sequence_min_value = ] sequence_min_value OUTPUT ]
        [, [ @sequence_max_value = ] sequence_max_value OUTPUT ]
        [ ; ]

    --=============================================
    --创建初始值为1递增1的序列
    CREATE SEQUENCE dbo.mySquence 
    AS INT 
    INCREMENT BY 1
    START WITH 1

    --=============================================
    --获取下个值
    SELECT NEXT VALUE FOR dbo.mySquence
    --=============================================
    --使用表排序后获取自增序列
    SELECT NEXT VALUE FOR dbo.mySquence OVER (ORDER BY C2) AS RID,
    C2 FROM [dbo].[TB4]
    --=============================================
    --可以在列的DEFAULT中使用序列
    ALTER TABLE Test.MyTable
    ADD DEFAULT N'AdvWorks_' + 
    CAST(NEXT VALUE FOR Test.CounterSeq AS NVARCHAR(20)) 
    FOR IDColumn;

    --============================================
    --获取4个连续的递增序列,并返回最小值
    DECLARE @range_first_value sql_variant , 
            @range_first_value_output sql_variant ;

    EXEC sp_sequence_get_range
    @sequence_name = N'dbo.mySquence'
    , @range_size = 4
    , @range_first_value = @range_first_value_output OUTPUT ;

    SELECT @range_first_value_output AS FirstNumber ;

    --=====================================
    --查看当前数据库中的自增列
    SELECT * FROM sys.identity_columns

  • 相关阅读:
    java做微信支付notify_url异步通知服务端的写法
    QT如何编译出带调试信息的qtwebkit库
    Vmware 占用宿主机硬盘空间只增不减
    vmware linux无法正常上网
    Linux中find常见用法示例
    计算机网络OSI参考模型与tcp/ip四层模型
    Core开发-后台任务利器Hangfire使用
    Azure构建PredictionIO和Spark的推荐引擎服务
    NET MVC+EF6+Bootstrap
    服务器
  • 原文地址:https://www.cnblogs.com/TeyGao/p/3519536.html
Copyright © 2011-2022 走看看