解决SQL Server 2008数据库主键自增的问题

Win10 安装 SQL Server 2008 与使用指南 背景 某喵学校学的是SQL Server 2008 R2,我学的是MySQL 2018,他找我 debug 的时候可能多少有点差别,就下了一个方便实操试试; 昨天他正常建表,设了联合主键之后正常插入数据报错如下:"违反了 PRIMARY KEY 约束 'PK_SC2'.不能在对象 'dbo.SC2' 中插入重复键."。我用相同步骤试了一下,发现没有问题,只好劝他重装(我很抱歉,但是重装大法好! 简介 SQL Server 系列软件是 Microsoft 公司推出的关系型数据库管理系统。2008年10月,SQ 阅读详情

1、原理实现

待补充。

2、设置主键自动增加


MS SQLServer


在MS SQLServer中,如果把表的主键设为identity类型,数据库就会自动为主键赋值。

create table customers(id int identity(1,1) primary key not null, name varchar(15));
insert into customers(name) values('name1'),('name2');
select id from customers;

注意:在sqlserver中字符串用单引号扩起来,而在mysql中可以使用双引号。

查询结果和mysql的一样。

由此可见,一旦把id设为identity类型,MS SQLServer数据库会自动按递增的方式为主键赋值。identity包含两个参数,第一个参数表示起始值,第二个参数表示增量。

MySql实现:

在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。例如:

create table customers(id int auto_increment primary key not null, name varchar(15));
insert into customers(name) values("name1"),("name2");
select id from customers;

以上sql语句先创建了customers表,然后插入两条记录,在插入时仅仅设定了name字段的值。最后查询表中id字段,查询结果为:

由此可见,一旦把id设为auto_increment类型,mysql数据库会自动按递增的方式为主键赋值。


图形化展现方式:


\


3、从序列中获取自动增长的标识符

在Oracle中,可以为每张表的主键创建一个单独的序列,然后从这个序列中获取自动增加的标识符,把它赋值给主键。例如一下语句创建了一个名为customer_id_seq的序列,这个序列的起始值为1,增量为2。

create sequence customer_id_seq increment by 2 start with 1

一旦定义了customer_id_seq序列,就可以访问序列的curval和nextval属性。

  • curval:返回序列的当前值
  • nextval:先增加序列的值,然后返回序列值

以下sql语句先创建了customers表,然后插入两条记录,在插入时设定了id和name字段的值,其中id字段的值来自于customer_id_seq序列。最后查询customers表中的id字段。

create table customers(id int primary key not null, name varchar(15));
insert into customers values(customer_id_seq.nextval, 'name1');
insert into customers values(customer_id_seq.nextval, 'name2');
select id from customers;

如果在oracle中执行以上语句,查询结果为:

通过触发器自动添加id字段

从上述插入语句可以发现,如果每次都要插入customer_id_seq.nextval的值会非常累赘与麻烦,因此可以考虑使用触发器来完成这一步工作。

创建触发器trg_customers

create or replace
trigger trg_customers before insert on customers for each row 
begin 
select CUSTOMER_ID_SEQ.nextval into :new.id from dual; 
end;

插入一条记录

insert into customers(name) values('test'); 

这是我们会发现这一条记录被插入到数据库中,并且id还是自增长的。


3.2 Java获取数据库自增主键表中插入数据的ID

  1. /** 
  2.  * 自增主键主键插入值后获取自增ID 
  3.  * @param sql 
  4.  * @return 
  5.  */  
  6. public int insertIntoDB(String sql){  
  7.     Connection conn = null;  
  8.     Statement state = null;  
  9.     ResultSet rs = null;  
  10.     int key = -1;  
  11.     try{  
  12.         conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jx3", "root", "root");  
  13.         state = conn.createStatement();  
  14.         state.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);  
  15.         rs = state.getGeneratedKeys();  
  16.         if(rs.next()){  
  17.             key = rs.getInt(1);  
  18.         }  
  19.         return key;  
  20.     }catch (SQLException e) {  
  21.         e.printStackTrace();  
  22.         return key;  
  23.     }finally{  
  24.         try{  
  25.             if(rs != null){  
  26.                 rs.close();  
  27.                 rs = null;  
  28.             }  
  29.             if(state != null){  
  30.                 state.close();  
  31.                 state = null;  
  32.             }  
  33.             if(conn != null){  
  34.                 conn.close();  
  35.                 conn = null;  
  36.             }  
  37.         }catch (SQLException e) {  
  38.             e.printStackTrace();  
  39.         }  
  40.     }  
  41. }

4、问题来了,加入主为1的数据删除后,如何进行插入主键为1的数据呢?

删除数据,重新添加带有显示值的数据


1
delete [xxx].[dbo].[t_test] where id = 1

插入带有显示值的数据:

1
insert into  [guagua_new_event_system_test].[dbo].[t_test] values (1, 'xiaoming' )
数据库提示:

消息 8101,级别 16,状态 1,第 1 行
仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'xxx.dbo.t_test'中的标识列指定显式值。

重新设置INDENTITY_INSERT为ON时,重新重加,sql 语句为:


1
SET  IDENTITY_INSERT [xxx].[dbo].[t_test]  ON  </span>

1
insert into  [xxx].[dbo].[t_test]  values (1, 'xiaoming' )</span>
数据库提示:消息 8101,级别 16,状态 1,第 2 行
仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'xxx.dbo.t_test'中的标识列指定显式值。


明明已经设置了INDENTITY_INSERT为ON,但是为什么还是没有添加进去,看了SQL Server 2008的帮助文档,才明白需要制定一一对应的列名在显示插入的时候。所以,正确的Sql 语句为:


1
2
3
SET  IDENTITY_INSERT [xxx].[dbo].[t_test]  ON
insert into  [xxx].[dbo].[t_test](id , name )  values (1, 'xiaoming' )
SET IDENTITY_INSERT [xxx].[dbo].[t_test] OFF </span>

只是在显示插入值的时候的时候需要制定列名,同时打开允许显示插入的INDENTITY_INSERT,才能够插入!


主键归零; http://www.open-open.com/lib/view/open1407922298176.html


http://www.cnblogs.com/xwdreamer/archive/2012/06/08/2542277.html

http://blog.youkuaiyun.com/zhuyucheng123/article/details/17502007

http://www.2cto.com/database/201406/310640.html

SQL SERVER 2008学习笔记1-创建表 在豆瓣和cnblog上写博客有一段时间,在豆瓣上写生活笔记,在cnblog上则写了几篇技术笔记,感叹于优快云论坛的强大,有些问题总会过来找,干脆博客也迁移过来。    最近这几个月在学习SQL SERVER2008,公司的crm系统建立在WINDOW SERVER2008+SQL SERVER2008的基础上,使用java开发。这个系统由我在负责维护,不可避免地我就需要学习SQL SERVER 阅读详情

相关推荐

SQL Server 2008 完整数据库管理教程

SQL Server 2008是微软公司推出的广泛使用的数据库管理系统,是SQL Server系列中的一个重要版本。它支持大型企业级应用的数据存储、处理和分析。SQL Server 2008以其高可靠性、安全性、可扩展性和易用性获得了IT行业专业人士和开发者的青睐。SQL(Structured Query Language)语言的数据定义功能允许我们创建、修改和删除数据库中的数据结构。它包含了一系列与数据结构定义相关的命令,即所谓的DDL(Data Definition Language)语句。

weixin_35705784的博客 1338

SQL Server 2008 主键自增

Sql 主键自增 环境:SQL Server 2008 问题:设置主键和把它设为自增。     环境:SQL Server 2008   问题:设置主键和把它设为自增。   解决:点击table->选中表->design->选中需要设置主键的字段,单击右键"设置主键"即可。   若要设置主键自增,在列属性中找到标识规范,单击左边的"+"号,把否改为是,其他默认即可。   Serve

fobdddf的专栏 2492

嵌入式接口通识知识之PCIe接口

PCIe x1接口是最常见的一种,插槽的长度是最短的,仅有25mm。PCIe x4接口有四个数据通道,提供比x1接口更高的带宽,插槽的长度为39mm,分为前后两组,一组22根针脚用于供电,剩下的42根针脚是数据针脚。插槽全长89mm,有164根针脚,分为前后两组,较短的插槽有22根针脚,主要用于供电,较长的插槽142根,主要用于数据传输,具有16通道所带来的高带宽。PCIe x8接口有八个数据通道,插槽全长56mm,有98跟针脚,分为前后两组,较短的22根针脚用于供电,剩下的76根针脚是数据针脚。

2301_76587520的博客 1306

避坑之SqlServer主键自增

今天使用INSERT into table(A,B,C) VALUES(?,?,?)总是报错主键不能为空,试了一下数据库是因为主键没有设置自增。 SqlServer仅可在创建表的时候设置主键自增,另一种是删除某一个字段,然后再添加此字段设置字段自增,不过这个需要原表没有数据。 ...

sinse_的博客 1161

华为铁三角(AR、SR、FR)的考核指标设计

以和为核心,通过和实现协同。考核维度分为和,并随市场阶段动态调整权重。

从技术实践立足,从项目管理方法论延伸思考 2780

【RViz2】导入urdf模型时报错:Could not load resource xxx,Unable to open file xxx,Error retrieving file xxx

初学ROS2,想要在RViz2中显示urdf模型。其中.urdf文件引用了外部的meshes文件夹。

qq_43557907的博客 9489

sql server 2008主键id自增设置

sql server manager 右键单击表“设计”弹出表设计对话框 单击id,在列属性下找到标识规范 设置标识增加为1 如果id要从某个数起步,则设标识种子为起步数 修改表的时候若是报错,则改下sql server manager的属性 ...

tajon1226的专栏 1723

可调电源的电路设计

可调电源在电路调试中经常用到,可调电源分为两种2-5v(非0点可调)和0-5v(低至0点可调)可调两种。 对于第一种非0点电压的可调范围,其主要是由于开关电源或LDO芯片输出的最小电压为一个固定电压值,非0范围。因此通过调节开关电源或LDO端的反馈电阻的设计模型,其电压可调范围都与芯片的参考电压有关。 基于开关电源的可调电压设计电路 因芯片U2的输出参考电压VSENSE管脚为1.22v。因此,通过调节可调电阻R8的数值,其芯片输出的最低电压一定不小于1.22v。当然此种方案是手动可调输出电压的设计,如

weixin_42257266的博客 9736

Cannot insert the value NULL into column 'StuID', table 'NETRepository.dbo.S

 问题描述:Cannot insert the value NULL into column 'StuID', table 'NETRepository.dbo.S(EFbug,主键有值,插入时候报空) 其中StuID有值。 问题原因:StuID默认为自增,所以被顶掉了。 问题解决方案:EF绑定的时候设置为主键增长方式为none  this.HasKey(i

wanglijie122的博客 5504

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

a_zxswer的博客 192

【部署优化篇三】《DeepSeek边缘计算实战:把目标检测模型塞进树莓派,让AI在巴掌大的设备上“开天眼“》

谁说只有超级计算机才能跑AI?今天咱们就要在树莓派上玩转DeepSeek目标检测,让这个巴掌大的小盒子变成会‘看’世界的智能终端!本文手把手教你从零开始,把最潮的目标检测模型塞进树莓派。全程高能预警,建议准备好你的树莓派4B/5和散热风扇,咱们这就开启边缘计算的魔法之旅!

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1306

Sql server 自增ID清空(让ID从1重新开始增加)

Sql server 清空id自增长(让ID可以重新开始增加) 图片名对不上:(此处页面拿到的图片名为8.png,但实际后台文件中图片名是6.png) 解决办法:执行sql脚本:dbcc checkident(‘table’,reseed,5) ,删除再重新添加N5层级数,他的id就变成6了。 ...

me_Jackyoyo的博客 2744

大数据分析利器:Tableau实战教程从入门到精通

你有3家分店,每月收集1000条销售数据(日期、分店、口味、销售额、订单数);想用Excel分析“哪家分店最赚钱”,但要做透视表→改格式→画柱状图,耗时30分钟,还经常因为公式错误返工;想看看“草莓味奶茶的月度销量趋势”,得手动筛选数据、调整折线图轴范围,稍不注意就漏看关键节点;想把分析结果分享给合伙人,Excel表格太抽象,对方盯着数字问“你到底想告诉我什么?

AI架构师小马 1497

sql2008中已存在已有数据表修改主键为自增不让更改的解决方案

今天在测试程序的时候,在保存数据时报了一个主键不能为空错误。我用的数据库是Sql2008 1.我测试跟踪后觉得这个表应该是自动增长主键呀。但数据库未进行设置。 2.那我就改吧,改完报如下错误: 3.后来得人指点说是sql2008中默认是不允许创建完表后再进行修改自增量字段的。所以进行了如下设置: 4.把下面阻止保存要求重新创建表的更改.不进行打条就OK了。 作者:王春天 ...

weixin_33850890的博客 921

全志T527-TP9930-Camera

TP9930 驱动模块主要实现将 4 路的 AHD/TVI/CVBS Camera 的数据转换为 BT656/BT1120 数据,从而实现在 T527 端来对数据进行处理和送显。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 3238

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SQL Server 2005附加2008的数据库

1. 生成for 2005版本的数据库脚本   2008 的manger studio   -- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例   -- 右键要转到2005的库   -- 任务   -- 生成脚本   -- 在"脚本向导"的"选择数据库"中, 确定选择的是要转到2005的库   -- 勾选"为所选数据库中的所有对象编写脚本"5 -- 在接下来的"选择脚

YoungIvan学习笔记 3259

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

sqlserver新增主键自增_SQLSERVER自增主键

SQLSERVER自增主键SQLServer 中含自增主键的表,通常不能直接指定ID值插入,可以采用以下方法插入。1. SQLServer 自增主键创建语法:identity(seed, increment)其中seed 起始值increment 增量示例:create table student(id int identity(1,1),name varchar(100))2. 指定自增主键列值...

weixin_39585463的博客 9548

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C# 连接 SQL Server 2008 基础操作+数据库增删改查

菜鸟教程,C#操作数据库。 安装数据库、启动SQLServer2008并连接数据库服务器,windows界面下简单操作数据库、C#连接数据库、数据库基本操作增删改查

u012586042的博客 2万+

《SQL Server2008数据库应用技术》 复习总结

目录 目录(点击链接可直接跳转) 目录 写在前面: 全书概要 划分重点 第三章 创建和管理表 第四章 索引与数据完整性 第五章 查询与视图 第六章 T-SQL程序设计 第七章 存储过程与触发器 写在前面: 抽时间总结了下数据库这门课本学期的全部内容 以课本和课后实验作业为参考,筛选了一些觉得相对重点的知识点和例题 汇总和整理了一下,方便复习,也方便以后查看。 文中含...

1900的博客 9471

网上书店数据库设计 SQL Server 2008 R2

使用关系型数据库SQL Server 2008 R2,通过脚本的方式新建网上书店的数据库BookShop BookShop共包含9张表,分别为BookType(图书类别表),Book(图书信息表),CustomerType(会员级别表),CUstomer(会员表),SysUser(系统用户表),LeaveWord(留言反馈表),ShoppingCart(购物车记录表),ShoppingCartL

J.Anson的博客 7990

SQL SERVER2008查询分析器的基本使用

以一个简单的药品信息库为例: 题目: 1 利用sql建立药品信息数据库,并定义以下基本表: 药品(编号,名称,价格,厂商编号) 处方(药品号,数量,医生编号) 医生 (编号,姓名,科室,职称) 定义主码、外码、和数量、价格的取值范围。 2 在三个表中输入若干记录,注意如果输入违反完整性约束条件的记录系统有何反应。 首先,打开SQLSERVER2008,打开查询分析器 建库: 药品信息库.sq...

Mr____Cheng的博客 1万+

SQL Server 2008可视化设置自增主键

wozengcong的专栏 2816

mysql2008主键是什么_SQL Server 2008 主键自增

环境:SQL Server 2008问题:设置主键和把它设为自增。解决:点击table->选中表->design->选中需要设置主键的字段,单击右键"设置主键"即可。若要设置主键自增,在列属性中找到标识规范,单击左边的"+"号,把否改为是,其他默认即可。create tabletableName(id int identity(1,1)primary key,data varch...

weixin_32460203的博客 161

sqlserver2008建表自增_sql server建表时设置ID字段自增的简单方法

打开要设置的数据库表,点击要设置的字段,比如id,这时下方会出现id的列属性表列属性中,通过设置“标识规范”的属性可以设置字段自增,从下图上看,“是标识”的值是否,说明id还不是自增字段能够设置ID字段自增的字段必须是可自增的,比如int,bigint类型,而varchar类型是不可自增的。比如查看name的列属性时,可以看到“是标识”是否且不可更改。点击“标识规范”,展开后,点击“是标识”会出现...

weixin_39517560的博客 1055

SQL server 2008R2 入门

SQL server 2008r2 入门

m0_61396811的博客 7951
上一篇: node.js安装socket.io总是报错“ws@0.5.0 install"
下一篇: Node.js入门-npm安装以及需要的modules
dreamjava9213
博客等级 码龄16年 7粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值