使用IDENTITY列属性和Sequence对象

使用IDENTITY列属性

1. 建立表 Sales.MyOrders

USE TSQL2012;
IF OBJECT_ID(N‘Sales.MyOrders‘, N‘U‘) IS NOT NULL DROP TABLE Sales.MyOrders;
GO

CREATE TABLE Sales.MyOrders
(
  orderid INT NOT NULL IDENTITY(1, 1)
    CONSTRAINT PK_MyOrders_orderid PRIMARY KEY,
  custid  INT NOT NULL
    CONSTRAINT CHK_MyOrders_custid CHECK(custid > 0),
  empid   INT NOT NULL
    CONSTRAINT CHK_MyOrders_empid CHECK(empid > 0),
  orderdate DATE NOT NULL
);

2. 插入一些记录

INSERT  INTO Sales.MyOrders
        ( custid, empid, orderdate )
VALUES  ( 1, 2, ‘20120620‘ ),
        ( 1, 3, ‘20120620‘ ),
        ( 2, 2, ‘20120620‘ );

3. IDENTITY 相关函数

SELECT
  SCOPE_IDENTITY()                AS SCOPE_IDENTITY, /*返回插入到同一作用域中的标识列内的最后一个标识值。
                                                      一个范围是一个模块:存储过程、触发器、函数或批处理。
                                                      因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。 */
  @@IDENTITY                      AS [@@IDENTITY], --与上面一样返回同一作用域内的最后一个标示符,但是不限作用域。
  IDENT_CURRENT(‘Sales.MyOrders‘) AS IDENT_CURRENT; --返回为指定的表或视图生成的最后一个标识值。

4. 如果Truncate 表,该表的IDENTITY的值就会重置,仅仅删除记录不会。

TRUNCATE TABLE Sales.MyOrders;

SELECT IDENT_CURRENT(‘Sales.MyOrders‘) AS [IDENT_CURRENT];

5. 使用DBCC CHECKINDENT 续种

DBCC CHECKIDENT(‘Sales.MyOrders‘, RESEED, 4);

INSERT INTO Sales.MyOrders(custid, empid, orderdate) VALUES(2, 2, ‘20120620‘);
SELECT * FROM Sales.MyOrders;

使用Sequence 对象

SQL Server 2012起引入了新的数据库对象 sequence,它不像IDENTITY 列属性有那么多限制(比如 IDENTITY 属性只能应用在某个表的某一列。 有时候你希望多个表的key没有冲突,但是IDENTITY无法跨表操作。你希望先生成一个值再使用,也不行。 你无法更新IDENTITY列。   IDENTITY 无法循环使用。 Truncate 会重置 IDENTITY值 )

1. 创建sequence

-- create sequence
IF OBJECT_ID(N‘Sales.SeqOrderIDs‘, N‘SO‘) IS NOT NULL DROP SEQUENCE Sales.SeqOrderIDs;

--部分参数
--INCREMENT BY   增量值,默认为1
--MINVALUE 最小值,默认为数据类型的最小值,比如INT的最小值为 -2147483648
--MAXVALUE 最大值,默认值为数据类型的最大值
--CYCLE|NO CYCLE 是否循环,默认为不循环
--START WITH ,设置一个起始值,默认起始值是升序序列对象的最小值和降序序列对象的最大值。
CREATE SEQUENCE Sales.SeqOrderIDs AS INT
  MINVALUE 1
  CYCLE;

2. 查询系统中的sequence

SELECT  TYPE_NAME(system_type_id) AS type ,
        start_value ,
        minimum_value ,
        current_value ,
        increment ,
        is_cycling
FROM    sys.sequences
WHERE   object_id = OBJECT_ID(N‘Sales.SeqOrderIDs‘, N‘SO‘);

3. 获取一个新值

-- request a new value;
SELECT NEXT VALUE FOR Sales.SeqOrderIDs;

4. 序列的所有属性都可以通过ALTER SEQUENCE命令修改。比如更改当前值

ALTER SEQUENCE Sales.SeqOrderIDs
  RESTART WITH 1;

5. 实际运用

a)  创建Sales.MyOrders 表并插入数据

-- recreate Sales.MyOrders table
IF OBJECT_ID(N‘Sales.MyOrders‘, N‘U‘) IS NOT NULL DROP TABLE Sales.MyOrders;
GO

CREATE TABLE Sales.MyOrders
(
  orderid INT NOT NULL
    CONSTRAINT PK_MyOrders_orderid PRIMARY KEY,
  custid  INT NOT NULL
    CONSTRAINT CHK_MyOrders_custid CHECK(custid > 0),
  empid   INT NOT NULL
    CONSTRAINT CHK_MyOrders_empid CHECK(empid > 0),
  orderdate DATE NOT NULL
);

-- use in INSERT VALUES
INSERT INTO Sales.MyOrders(orderid, custid, empid, orderdate) VALUES
  (NEXT VALUE FOR Sales.SeqOrderIDs, 1, 2, ‘20120620‘),
  (NEXT VALUE FOR Sales.SeqOrderIDs, 1, 3, ‘20120620‘),
  (NEXT VALUE FOR Sales.SeqOrderIDs, 2, 2, ‘20120620‘);

-- use in INSERT SELECT
INSERT INTO Sales.MyOrders(orderid, custid, empid, orderdate)
  SELECT
    NEXT VALUE FOR Sales.SeqOrderIDs OVER(ORDER BY orderid),
    custid, empid, orderdate
  FROM Sales.Orders
  WHERE custid = 1;

b) 直接把sequence设为default约束

ALTER TABLE Sales.MyOrders
  ADD CONSTRAINT DFT_MyOrders_orderid
    DEFAULT(NEXT VALUE FOR Sales.SeqOrderIDs) FOR orderid;

测试

INSERT INTO Sales.MyOrders(custid, empid, orderdate)
  SELECT
    custid, empid, orderdate
  FROM Sales.Orders
  WHERE custid = 2;

参考文档

SCOPE_IDENTITY (Transact-SQL)

https://msdn.microsoft.com/zh-cn/library/ms190315.aspx

@@IDENTITY (Transact-SQL)

https://msdn.microsoft.com/zh-cn/library/ms187342.aspx

IDENT_CURRENT (Transact-SQL)

https://msdn.microsoft.com/library/ms175098.aspx

CREATE SEQUENCE (Transact-SQL)

https://msdn.microsoft.com/zh-cn/library/ff878091.aspx

时间: 2024-10-24 14:48:03

使用IDENTITY列属性和Sequence对象的相关文章

列属性:RowGUIDCol 和 Identity

Table Column有两个特殊的属性RowGUIDCol 和 Identity,用于标记数据列: $ROWGUID 用于引用被属性 RowGUIDCol 标识的UniqueIdentifier 类型的 column: $IDENTITY 用于引用被属性 Identity 标识的整数类型(int,bigint,tinyint,smallint,decimal(p,0))的 column: 在每个table中,只能有一列被标识为RowGUIDCol,只能有一列被标识为Identity: 一,属性

列属性:RowGUIDCol、Identity 和 not for replication

在SQL Server中,创建数据表,需要为表设置合适的属性和约束,例如,自增列,非空,主键等,以满足业务的需求,一般来说,数据表存储的实体都应该唯一标识,使用ID列或GUID列来充当候选主键是可以的,相应地,数据表的列(Column)有两个特殊的属性: RowGUIDCol:用于标识UniqueIdentifier 类型的数据列,该列可以通过内置函数 $ROWGUID 来引用: Identity:用于标识整数类型(int,bigint,tinyint,smallint,decimal(p,0)

Replication的犄角旮旯(五)--关于复制identity列

原文:Replication的犄角旮旯(五)--关于复制identity列 <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Replication的犄角旮旯(三)--聊聊@bitmap Replication的犄角旮旯(四)--关于事务复制的监控 Replication的犄角旮旯(五)--关于复制identity列 Replication的犄角旮旯(六)-- 一个D

Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别(转)

一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:  其中 i.加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构.即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,无论这个类创建了多少个对象,他的Class对象时唯一的!!!!.

msyql定义列属性

定义列属性 (列属性,列约束) 是否为空 not null  默认值    default 0  主键     primary key    (可以唯一识别,某条记录的字段或者是字段的集合,就是主键)  自动增长   auto_increment (可以设置自动增长的初始值) 例: auto_increment 10(这样就会从10开始增长)   注释     comment 'xxx'    (注释:可以让我们清晰看懂这个属性)

20141230 mysql数值类型和列属性一

枚举字符串 枚举字符串指的是在定义之初就确定要存放的字符串有哪些,然后在数据进行存储的时候就只能存储已经定义过的字符串,只能使用任意的一个字符串.(单选框) 语法:enum 字段名 enum(字符串1,字符串2,-); 枚举采用最多2个字节保存数据,最多能存65535个数据 枚举的意义 1. 规范数据:没有进行维护的数据不能插入 2. 节省空间:实际存储的数据是数字 虽然SQL是一种强类型语言,但是SQL能够自动转换数据类型(与php一样) select有一个特点:后面可以跟任意表达式 证明枚举

学习笔记:MySQL列属性

列属性 a)         null|not null 缺省值是null,也就是允许为空,如果是not null而又没有给该字段赋值的话,系统会首先查询该字段有没有默认值 b)         default: 给一个字段一个默认值,如果没有给该字段填充数据,就用该默认值来代替,通常就是配合not null一起使用 c)         primary key: 主键,唯一可区别其他记录的字段,一个表中只能有一个主键,也可以很多个字段组合成一个组合主键,而且不允许为空! d)        

列属性

列属性 Table of Contents auto_increment default comment auto_increment auto_increment 必须用在 primary_key 上 create table xxx ( id int(10) unsigned primary key auto_increment, ) auto_increment=1; # 表示从 1 开始计算 default default 就是插入的时候不指定值的时候自动赋予的值 create tabl

db2 identity列重置,reset/restart

db2中可以对表中的某一个列创建identity列,用于自动填充值,某些情况下(比如删除数据后,需要从最小值开始,并不重复,那可以对标识列进行reset操作) 语法: 1 ALTER TABLE <table name> ALTER COLUMN <IDENTITY column> 2 RESTART WITH <last counter value> 官方解释资料如下: 修改标识列定义 过程 若正在重新创建表然后执行导入或装入操作, 并且在表中具有 IDENTITY