sql中sequence的用法

sequence是序列号的意思,每次取的时候它会自动增加。sequence与表没有从属关系,与表一样属于用户。

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。

1、Create Sequence语法

首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,CREATE SEQUENCE emp_sequence

INCREMENT BY 1 -- 每次加几个

START WITH 1 -- 从1开始计数

NOMAXVALUE -- 不设置最大值

NOCYCLE -- 一直累加,不循环

CACHE 10;

一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL

CURRVAL=返回 sequence的当前值

NEXTVAL=增加sequence的值,然后返回 sequence 值

比如:

emp_sequence.CURRVAL

emp_sequence.NEXTVAL

可以使用sequence的地方:

- 不包含子查询、snapshot、VIEW的 SELECT 语句

- INSERT语句的子查询中

- NSERT语句的VALUES中

- UPDATE 的 SET中

可以看如下例子:

INSERT INTO emp VALUES

(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);

SELECT empseq.currval FROM DUAL;

但是要注意的是:

第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。

一次NEXTVAL会增加一次SEQUENCE的值。但是如果你在同一个条SQL语句里面针对同一个sequence使用多次NEXTVAL,其值都是一样的。

如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。?

使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

2、Alter Sequence

你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create .

Alter sequence 的例子:

ALTER SEQUENCE emp_sequence

INCREMENT BY 10

MAXVALUE 10000

CYCLE -- 到10000后从头开始

NOCACHE ;

影响Sequence的初始化参数:

SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。

可以很简单的Drop Sequence

DROP SEQUENCE order_seq;

修改sequence参数:

拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence再create。例:

alter sequence SEQ maxvalue 9999999;

alter sequence SEQ cache 10;

在Sql语句中可以使用sequence的地方:

(1)不包含子查询、snapshot、VIEW的 SELECT 语句

(2)INSERT语句的子查询中

(3)INSERT语句的values中

(4)UPDATE 的 SET中

例如:

insert into student(id,name) values(seq.Nextval,'jack');

注意:

第一次NEXTVAL返回的是初始值,随后的NEXTVAL会返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则报如下错误:

ORA-08002 序列currval尚未在会话中定义。

使用一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你多次执行包含NEXTVAL的一条语句,其值就是不一样的。

删除sequence:drop sequence seq_a;?

当删除sequence后,对应它的同义词会被保留,但是引用时会报错。

oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、SV锁。?

row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性;?

SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。?

SV 锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了

cache 和order属性 (cache+order)。order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。

扩展资料:

定义Sequence:定义一个seq_test,最小值为10000,最大值为99999999999999999,从20000开始,增量的步长为1,缓存为20的循环排序Sequence。

定义方法:

create sequence seq_test

minvalue 10000

maxvalue 99999999999999999

start with 20000

increment by 1

cache 20

cycle

order;

DB2的写法:

create sequence seq_test

as bigint

start with 20000

increment by 1

minvalue 10000

maxvalue 99999999999999999

cycle

cache 20

order;

PostgreSQL的写法:

create sequence seq_test

increment by 1

minvalue 10000

maxvalue 99999999999999999

start 20000

cache 20

cycle;

二、Oracle、DB2、PostgreSQL数据库Sequence值的引用参数为:currval、nextval,分别表示当前值和下一个值。下面分别从三个数据库的Sequence中获取nextval的值。

Oracle中:seq_test.nextval

例如:select seq_test.nextval from dual;

DB2中:nextval for SEQ_TOPICMS

例如:values nextval for seq_test;

PostgreSQL中:nextval(seq_test)

例如:select nextval('seq_test');

三、Sequence与indentity的区别与联系

Sequence与indentity的基本作用都差不多。都可以生成自增数字序列。

Sequence是数据库系统中的一个对象,可以在整个数据库中使用,和表没有任何关系;indentity仅仅是指定在表中某一列上,作用范围就是这个表。

四、postgresql中的Sequence分配策略(postgresql8.3.x)

调用select nextval(seq_test);后,系统马上分配一个序号给用户,然后系统的次Sequence马上加上之前设置的步长(increment by 1),不论此序号用户是否使用。

调用select currval(seq_test);返回当前的序列号,该序列号只要没有使用,就不会变化,直到被使用后,才会变化,并且该序列号已经分配给当前请求,不会再分配给其他的请求。

所以,减少浪费时,使用currval,不在乎浪费,而且id不连续的话,可以使用nextval。因为一旦分配给你后,使用失败,将会把该序列号丢弃!

参考资料:

百度百科-sequence

参考资料:

百度百科-结构化查询语言

ibatis怎么连接mysql数据库连接池

你要注意javabean的规范,首字母不要大写,第二个字母也不要大写

为 JavaBean 创建属性时,必须牢记:缩略语通常被视为一个独立的单词,而不是单个字母。例如,URL 对应的属性名应该用 url,相应的 getUrl()/setUrl(),所以 ID 还是用 id 作为属性吧,相应的 getId()/setId()。

规范中另一个特别的地方就是,第二个字母为大写的属性名要区别对待。如果属性名的第二个字母是大写的,那么该属性名直接用作 getter/setter 方法中 get/set 的后部分,就是说大小写不变。

楼主注意看一下。第二个字母不要大写!

1、Ibatis是MyBatis的前身,它是一个开源的持久层框架。它的核心是SqlMap——将实体Bean跟关系数据库进行映射,将业务代码和SQL语句的书写进行分开。

2、Ibatis是“半自动化”的ORM持久层框架。这里的“半自动化”是相对Hibernate等提供了全面的数据库封装机制的“全自动化”ORM实现而言的,“全自动”ORM实现了POJO与数据库表字段之间的映射并且实现了SQL的自动生成和执行。

3、而Ibatis的着力点,则在于POJO与SQL之间的映射关系,即Ibatis并不会为程序员在运行期自动生成并执行SQL,具体的SQL语句需要程序员编写,然后通过映射配置文件将SQL语句所需的参数和返回的结果字段映射到指定POJO中。

4、StudentDao.java文件中的代码:

package?com.ghj.dao.imp;import?java.io.IOException;import?java.io.Reader;import?java.sql.SQLException;import?java.util.HashMap;import?java.util.List;import?java.util.Map;import?com.ghj.dao.IStudentDao;import?com.ghj.vo.Student;import?com.ibatis.common.resources.Resources;import?com.ibatis.sqlmap.client.SqlMapClient;import?com.ibatis.sqlmap.client.SqlMapClientBuilder;/**?*?学生管理数据访问层接口实现类?*?*?@author?高焕杰?*/public?class?StudentDao?implements?IStudentDao?{private?SqlMapClient?sqlMapClient;public?StudentDao()?{String?resource?=?"config/sqlMapConfig.xml";try?{Reader?reader?=?Resources.getResourceAsReader(resource);//读取配置文件sqlMapClient?=?SqlMapClientBuilder.buildSqlMapClient(reader);}?catch?(IOException?e)?{e.printStackTrace();}}/**?*?添加学生信息?*?*?@author?高焕杰?*/@Overridepublic?boolean?add(Student?student)?throws?SQLException{return?sqlMapClient.update("add",?student)?>?0;}/**?*?依据用户名删除学生信息?*?*?@author?高焕杰?*/@Overridepublic?boolean?deleteByUserName(String?userName)?throws?SQLException{return?sqlMapClient.delete("deleteByUserName",?userName)?>?0;}/**?*?依据用户名更新密码?*?*?@author?高焕杰?*/@Overridepublic?boolean?updatePasswordByUserName(String?userName,?String?password)?throws?SQLException{Map<String,?Object>?params?=?new?HashMap<String,?Object>();params.put("userName",?userName);params.put("password",?password);return?sqlMapClient.update("updatePasswordByUserName",?params)?>?0;}/**?*?根据学生用户名查询学生信息?*?*?@author?高焕杰?*/@Overridepublic?Student?findByUserName(String?userName)?throws?SQLException{return?(Student)sqlMapClient.queryForObject("findByUserName",?userName);}/**?*?查询所有学生信息?*?*?@author?高焕杰?*/@Override@SuppressWarnings("unchecked")public?List<Student>?findAll()?throws?SQLException{return?sqlMapClient.queryForList("findAll");}}

student.xml文件中的代码:

<?xml?version="1.0"?encoding="UTF-8"?><!DOCTYPE?sqlMap?PUBLIC?"-//ibatis.apache.org//DTD?SQL?Map?2.0//EN"?"

!--?为Student类设置一个别名?--><typeAlias?alias="student"?type="com.ghj.vo.Student"/><!--?配置表和实体Bean之间的映射关系?--><resultMap?id="studentMap"?><result?property="id"?column="id"/><result?property="userName"?column="user_name"/><result?property="password"?column="password"/><result?property="state"?column="state"/></resultMap><!--?添加学生信息?--><insert?id="add"?parameterClass="student">insert?into?student?values(#id#,?#userName#,?#password#,?#state#)</insert><!--?依据用户名删除学生信息?--><delete?id="deleteByUserName"?parameterClass="java.lang.String">?delete?from?student?where?user_name=#userName#?</delete><!--?依据用户名更新密码?--><update?id="updatePasswordByUserName"?parameterClass="java.util.HashMap">update?student?set?password=#password#?where?user_name=#userName#?</update><!--?根据学生用户名查询学生信息?--><select?id="findByUserName"?parameterClass="string"?resultMap="studentMap">select?*?from?student?where?user_name=#userName#</select><!--?查询所有学生信息?--><select?id="findAll"?resultMap="studentMap">select?*?from?student</select></sqlMap>

本文来自作者[语兰]投稿,不代表伍月号立场,如若转载,请注明出处:https://wuyuewh.cn/yue/2163.html

(9)

发表回复

请登录后评论...
作者才能评论
  • 语兰的头像
    语兰 2025年08月06日

    我是伍月号的签约作者“语兰”

  • 语兰
  • 语兰