`
8366
  • 浏览: 811390 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

第8讲 --sql主键生成方式

阅读更多

 

 

补充: Oracle中的序列

 转载:http://onlylovexue.iteye.com/blog/266990

Oracle中的序列号顾名思义就是创建一个序列号,可以在插入或者更新的时候调用,相当于是一个生成器
创建语法:
create sequence myse
increment by 1       --增长度
start with 1         --从哪里增加,就是说下一个获取的值从这个值开始
nomaxvalue           --不设置最大值   对应的:maxvalue  30、
order                --指定一定往下增加
nocycle              --不循环,CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环
cache  10           --CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能

修改:
序列的某些部分也可以在使用中进行修改,但不能修改SATRT WITH选项。对序列的修改只影响随后产生的序号,已经产生的序号不变。修改序列的语法如下:
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXVALUE 10000
CYCLE -- 到10000后从头开始
NOCACHE ;


需注意:
第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。

删除:

DROP SEQUENCE order_seq;

 

 

问题: studend 表的主键 是sid,我们插入一条数据时候,是由外部程序控制的,也就是说你无法避免外部程序插入相同主键的数据,从而造成错误。

解决方式:

 

1.如果你是Oracle数据库,你可以采用数据库命令来创建一个 序列,然后主键使用这个 序列 来创建记录,而不依赖外部程序显示的设置 student.setSid(一个数字);

 

步骤:

  a.在oracle的控制台使用命令行的方式创建序列:创建了一个studentPKSquence 序列,它从1开始,每次增加1

        

     craeate sequence studentPKSquence start with 1 increment by 1

 

 b.改写student.xml,插入一个记录,主键由序列控制

<insert id="addStudentBySequence" parameterClass="Student">
	<!-- 序列的返回值是int类型,并且序列夹在sid属性上,对应数据库 sid列 -->
	<selectKey resultClass="int" keyProperty="sid">
		select studentPKSquence.nextVal from dual
	</selectKey>
	insert into student values (#sid#,#sname#,#major#,#birth#,#score#) 
	
</insert>

 

c.测试

StudentDAO studentDAO=new StudentDAOImpl();
		Student student=new Student();
		student.setSid(1234);
		student.setSname("胡晓亮3");
		student.setMajor("哈哈");
		student.setScore(98);
		student.setBirth(new Date(System.currentTimeMillis()));
		studentDAO.add(student);

 

 

d.结果

数据库中多了一条记录,即使你使用了student.setSid(1234); 来设置主键的值也不起作用,而主键的值设置成了自动通过序列产生的主键值 select studentPKSquence.nextVal from dual

 

注意:Student 对象 如果加上了带参数的构造方法,以上运行将会出错,出错原因是累实例化错误,由于ibatis利用的也是反射,这里也告诉我们反射动态创建对象利用的是类的默认的构造方法,如果类中有带参数的构造方法,你必须显示的给出类的无参构造方法,然后利用反射动态创建对象的时候才不会出错。

2.如果你是Mysql数据库,你可以auto_increment  主键自动增长

   a.当你在外部构造记录的时候如果你现实的调用的student.setSid(1234);那么数据库中的记录就是你设置的值,如果你们有调用student.setSid();那么插入到数据库中的记录的主键则会根据当前的值自动增长。。

3.如果你是sqlserver数据库: identity(1,1) primary key not null  主键自动增长

 

分享到:
评论

相关推荐

    2021-2022年收藏的精品资料第4章---SQL-Server表的管理2.ppt

    创建表通常有两种方式:一是使用SQL Server企业管理器的表设计器,二是直接编写Transact-SQL语句。例如,以下是一个简单的表定义: ```sql CREATE TABLE employee ( employee_id char(4) NOT NULL, employee_name...

    SQL-参考大全资料

    - **SQL基本概念**:通过第一章介绍SQL的基础概念,为后续章节的学习打下坚实的基础。 - **简单查询**:学习如何构建简单的SELECT语句来检索数据。 - **多表查询(JOIN)**:讲解如何通过JOIN操作来合并多个表的数据...

    程序员的SQL金典6-8

    #### 第8章 子查询 **8.1 子查询入门** - **单值子查询** - 返回单个值。 - **列值子查询** - 返回多行单列数据。 **8.2 SELECT列表中的标量子查询** - 在`SELECT`列表中嵌套查询。 **8.3 WHERE子句中的标...

    SQL语句教程--教你写好SQL语句

    ### SQL语句教程知识点详解 #### 一、SELECT语句 **定义与作用:** - `SELECT` 是SQL中最常用的语句之一,主要用于从数据库表中检索数据。 - **基本语法**: ```sql SELECT column_name FROM table_name; ``` - ...

    ASP与SQL网页数据库程序设计

    2 执行生成SQL脚本 179 7-1-3 执行SQL脚本文件 181 7-2 收缩数据库 182 7-3 数据库备份与还原 185 7-3-1 备份模式 185 7-3-2 数据库备份 186 7-3-3 数据库备份设置实例 189 7-3-4 数据库...

    ASP和SQL网站数据库程序设计(DOC)

    第8章 Transact-SQL语法基础…………….207 8-1 Transact-SQL 表达式 208 8-1-1 数学表达式 208 8-1-2 字符串表达式 209 8-1-3 比较表达式 209 8-1-4 逻辑表达式 210 8-1-5 表达式的优先级 210 8-2 ...

    SQLServer2000开发者指南(pdf)

    #### 第8章 在 C# 中使用嵌入 SQL 访问 SQL Server 数据库 - **8.1 嵌入式 SQL 应用程序开发环境** - 讨论如何在 C# 环境下开发 SQL 应用程序。 - **8.2 嵌入式 SQL 数据类型** - SQL 数据类型与 C# 类型之间的...

    SQL Server学习总结.docx

    #### 八、SQL语句中AS的用法和作用 - **8.1 AS是别名关键字** - **用途**:在SQL查询中为表或列指定别名,提高查询结果的可读性。 - **示例**:`SELECT column1 AS ColumnName FROM table;` #### 九、T-SQL语法...

    数据库文档生成器-----

    8. 第三方工具:数据库文档生成器是第三方软件的一个例子,它们通常提供额外的功能和便利,补充官方数据库管理系统的不足。在选择这类工具时,要考虑其功能、稳定性、支持情况以及是否符合项目需求。 总的来说,...

    SQL-Server-2008---Step-by-Step.rar_SQL SERVER 2008_step by step

    8. **Reporting Services**:SQL Server 2008的Reporting Services提供了强大的报表生成和分发功能。学习如何设计和发布交互式报表,以及如何配置报表服务器。 9. **Integration Services**:这是数据集成和ETL...

    sql and pl/sql

    ### SQL与PL/SQL知识点详解 #### 一、资料库基本概念 - **数据库管理系统(DBMS)**:Oracle数据库管理系统是一种关系型数据库管理系统(RDBMS),它使用SQL作为查询语言,支持多种数据类型、安全性特性以及事务...

    ejb3 第10讲 --开发单表映射的实体bean

    本教程聚焦于EJB 3,特别是第10讲,主要讲解如何开发单表映射的实体Bean。在本篇详细解答中,我们将深入探讨EJB 3中的实体Bean及其与数据库单表映射的关系。 首先,实体Bean是EJB的一种类型,代表业务逻辑中的持久...

    sql分页的存储过程

    本文将详细介绍一个SQL分页的存储过程,该过程能够根据输入参数动态生成SQL查询语句,实现分页功能。 #### 二、存储过程定义 此存储过程名为 `PrcPager`,其定义如下: ```sql CREATE PROCEDURE PrcPager @...

    oracle与sqlserver的十大区别之一.txt

    - **SQL Server**:支持自动增长列(`IDENTITY`),通常用于主键生成。 - 示例:`CREATE TABLE Table_Name (ID INT IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(50));` - **Oracle**:使用序列(sequence)来实现自动...

    PL_SQL生成日期维度表

    ### PL/SQL 生成日期维度表 #### 一、创建日期维度表 在数据库系统中,日期维度表是数据仓库中的一个关键组成部分,用于存储与日期相关的各种属性,以支持复杂的查询和分析需求。以下是对如何使用 PL/SQL 创建一个...

    SQL Server实用教程 第五版 课件 (郑阿奇)

    《SQL Server实用教程 第五版 课件 (郑阿奇)》是一套全面介绍SQL Server数据库管理系统的教学资源,由知名讲师郑阿奇编著。本教程针对SQL Server的第五个主要版本,提供了深入浅出的讲解,适合数据库原理课程学习...

    sql权威指南第4版

    《SQL权威指南》第四版是数据库管理领域的一本经典之作,专为那些希望深入理解和熟练掌握SQL语言的读者而设计。这本书全面覆盖了SQL的各个方面,包括基础语法、查询优化、事务处理、存储过程以及高级特性和应用。...

    21天学会sql

    #### 第八部分:操作数据 - **数据操作语句**:包括INSERT、UPDATE和DELETE等用于增删改查数据的基本操作。 - **插入语句**:向表中添加新的记录。 - INSERT VALUES:显式指定要插入的值。 - INSERT SELECT:从一...

Global site tag (gtag.js) - Google Analytics