使用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, '' ),
( 1, 3, '' ),
( 2, 2, '' );
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, '');
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, ''),
(NEXT VALUE FOR Sales.SeqOrderIDs, 1, 3, ''),
(NEXT VALUE FOR Sales.SeqOrderIDs, 2, 2, ''); -- 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
使用IDENTITY列属性和Sequence对象的更多相关文章
- 列属性:RowGUIDCol、Identity 和 not for replication
Table Column有两个特殊的属性RowGUIDCol 和 Identity,用于标记数据列: $ROWGUID 用于引用被属性 RowGUIDCol 标识的UniqueIdentifier 类 ...
- hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性
// hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性 @Override public TeamPlan getTeamPlanByBaoMingId(String bao ...
- Replication的犄角旮旯(五)--关于复制identity列
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- 使用C#导出MSSQL表数据Insert语句,支持所有MSSQL列属性
在正文开始之前,我们先看一下MSSQL的两张系统表sys.objects . syscolumnsMSDN中 sys.objects表的定义:在数据库中创建的每个用户定义的架构作用域内的对象在该表中均 ...
- {{angular.js 使用技巧}} - 实现计算列属性
前端MV*框架现在有很多,其中某些框架有计算列(又叫监控属性),比如:微软推荐的 Knockout.js 和博客园司徒正美的 avalon.js 框架. 本人只使用过 Knockout.js,aval ...
- easyui 如何为datagrid添加自定义列属性(如:width,align,editor)
我在实际业务需要为datagrid添加一个自定义属性 原先的datagrid列属性包括:title.width.align.formattter.editor等 我们可以通过datagrid的一个方法 ...
- 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间
[源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...
- jqGrid使用setColProp方法动态改变列属性
在使用jqGrid插件时,有时我们需要动态改变列的属性,可使用setColProp方法,用法如下 jQuery(”#grid_id”).setColProp('colname',{editoption ...
- 学习笔记:MySQL列属性
列属性 a) null|not null 缺省值是null,也就是允许为空,如果是not null而又没有给该字段赋值的话,系统会首先查询该字段有没有默认值 b) de ...
随机推荐
- hdu 4033 Regular Polygon 计算几何 二分+余弦定理
题目链接 给一个n个顶点的正多边形, 给出多边形内部一个点到n个顶点的距离, 让你求出这个多边形的边长. 二分边长, 然后用余弦定理求出给出的相邻的两个边之间的夹角, 看所有的加起来是不是2Pi. # ...
- 强化:把treeview的QString路径转换为QModelIndex节点,有了节点就什么都好办了
http://doc.qt.io/qt-4.8/qdirmodel.html#index-2 甚至还能直接调用setData: setData(const QModelIndex &index ...
- Qt窗口屏幕居中显示(有专门的QDesktopWidget,先计算后显示)
窗口的屏幕居中显示问题,在各开发工具中原理相同,首先使用特定的方法得到显示屏幕的宽度和高度,再根据窗口本身的宽度和高度计算出窗口的左上角坐标位置. Qt中可以采用两种方法达到窗口的屏幕居中显示: 方法 ...
- Vim 实用技术,第 2 部分: 常用插件(转)
http://blog.jobbole.com/20619/ 2.1. gzip(压缩文件支持) 作者:Bram Moolenar 网站脚本编号:无(包含在 Vim 的标准发布之中) 安装说明:无 功 ...
- HDU 5763 Another Meaning(FFT)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5763 [题目大意] 给出两个串S和T,可以将S串中出现的T替换为*,问S串有几种表达方式. [题解 ...
- [cpp]伯乐在线编程挑战第 0 期 – 呼叫转移系统
题目: 描述 呼叫转移服务是一个把呼叫号码A转移到号码B的服务.举个例子:当你正在度假时,这样的系统非常有帮助.A君度假去了,那么,A君的工作电话可以通 过呼叫转移至B君.更进一步讲,当B君也正好在度 ...
- Linux操作系统定时任务系统Cron入门、PHP计划任务以及rpc示例
一.简单介绍 1.cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动.关闭这个服务: servic ...
- Libcurl安装及编译
1.安装curl wget http://curl.haxx.se/download/curl-7.26.0.tar.gz tar -zxvf curl-7.26.0.tar.gz cd curl- ...
- SQL Server 链接数据库 error:40
链接到远程服务器的话,经常犯这个错误,所以做个笔记,省的每次去百度. 1.如果使用的是 local 链接,只需要启动服务就可以了(如下图) 2.如果是远程链接的话,那么是需要启动TCP协议的,步骤如下
- 将Oracle数据库导出为txt格式
将Oracle数据库导出为txt格式: 方法1: 对于Windows系统,可以采用以下方式: 选择控制面板-->管理工具-->数据源(ODBC),添加一个新的数据源(系统或用户DSN均可) ...