`
jsczxy2
  • 浏览: 1275695 次
  • 性别: Icon_minigender_1
  • 来自: 常州
文章分类
社区版块
存档分类
最新评论

在Oracle、MySQL、MS SQL Server中创建自动增长字段

阅读更多

好吧,今天面试有道题,要各个数据库怎么建立自增长字段,顺便复习一下吧,最近面试很多数据库问题。。。

一:Oracle

 

Oracle中创建自增长字段,要建序列和触发器, 
1.先创建序列 

通过创建序列来实现 
ORACLE 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的值,所以如果你在同一个语句里面使用多个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;

2.创建触发器 

-- 
CREATE   OR   REPLACE   TRIGGER   USERADD 
BEFORE   INSERT   ON   MEMBERRG 
FOR   EACH   ROW 
BEGIN 
        emp_sequence.NEXTVAL   INTO   :NEW.NUM   FROM   DUAL; 
END; 

 

 但是如果数据库表已经有数据了怎么办呢?又不能重新去插数据触发触发器,这样很繁琐,怎么办?

 

在表中增加一个列,为自增序列,然后执行:

update 表 set 自增序列=rownum;

这样就把以前的3000多万行都编号了,然后再用Sequence做序列;

   OK,下来举个具体的例子好了:

 

 

一、在Oracle中的没有自动增长的数据类型,但可以使用序列(Sequence)代替。具体步骤如下:

1、 创建一个t_user的用户表:
create table t_user(
       id number primary key,
       userName varchar2(15) not null unique,
       userPass varchar2(20)
);

2、 创建一个序列seq_user_id:
create sequence seq_user_id
start with 1 –从1开始
increment by 1;--每次增量为1

3、 创建一个触发器使给id 赋值:
create trigger tr_user_id
before
insert
on t_user
for each row
begin
     select seq_user_id.nextval into :new.id from dual;
end;



insert into t_user (userName,userPass) values('handson','handson');

insert into t_user (userName,userPass) values('admin','admin');

 接下来介绍一个通用一点的做法,使用存储过程:

 

二、创建一个存储过程来建立自动增长字段:

1、 Oracle中执行动态SQL时要显示授权(即使该用户拥有该相关权限)
grant create any sequence to scott;

grant create any trigger to scott;


2、建立一个创建自增字段的存储过程
create or replace procedure pro_addIncrement(tableName in varchar2 , columnName in varchar2)

as

strsql varchar2(1000);

begin

strsql := 'create sequence seq_'||tableName||'_'||columnName||' start with 1 increment by 1';

execute immediate strsql;    

strsql := 'create or replace trigger tr_'||tableName||'_'||columnName||' before insert on '||tableName||' for each row

begin

select seq_'||tableName||'_'||columnName||'.nextval into :new.'||columnName||' from dual;

end;';

execute immediate strsql;

end;


2、 调用存储过程建立自增字段并测试
create table t_user(

       id number primary key,

       userName varchar2(20) not null unique,

       userPass varchar2(20)

);

exec pro_addIncrement('t_user','id');

insert into t_user (userName,userPass) values('handson','handson');

insert into t_user (userName,userPass) values('admin','admin');

insert into t_user (userName,userPass) values('yangdongxin','pass');

insert into t_user (userName,userPass) values('java','java');

 

二:mysql

 

 

创建表t_user
create table t_user(

id int primary key auto_increment,--auto_increment表示自动增长,增量为1

userName varchar(15) not null unique,

userPass varchar(20)

);

insert into t_user (username,userPass) values(‘handson’,’handson’)

,(‘admin’,’admin’);

 

三:sql server

 

 

create table t_user(

id int primary key identity(1,1),

userName varchar(15) not null unique,

userPass varchar(20)

)

identity(begin,increment) begin:从哪一个位置开始。increment:表示每次增长的大小

insert into t_user (username,userPass) values(‘handson’,’handson’)

insert into t_user (username,userPass) values(‘admin’,’admin’)
 

 

分享到:
评论

相关推荐

    Oracle_Mysql_Sqlserver字段类型转换参考

    Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_Mysql_Sqlserver字段类型转换参考Oracle_...

    通用SQL教程oracle,mysql,sqlserver

    本教程涵盖了SQL在三大主流数据库系统——Oracle、MySQL和SQL Server中的应用,旨在帮助学习者掌握通用的SQL知识,从而能够高效地进行数据查询、更新、插入和删除等操作。 在Oracle数据库中,SQL被广泛应用于数据的...

    Oracle|Sqlserver|MySql数据库表结构一键生成工具

    在SQL Server中,表结构的定义包括列、约束、存储过程等元素。通过一键生成工具,这些信息可以被整合到一个统一的文档中,方便团队成员理解和维护数据库结构。 MySQL则是一款开源、免费的数据库系统,被广泛应用在...

    oracle到sqlserver 跨库查询

    Oracle 到 SQL Server 跨库查询是指通过网关工具将数据从 SQL Server 数据库中抽取到 Oracle 数据库中。这个过程需要安装和配置网关软件,并进行相应的设置和配置。 一、网关软件安装 网关软件的安装是跨库查询的...

    Oracle Sql语句转换成Mysql Sql语句

    在数据库管理领域,Oracle SQL和MySQL SQL是两种广泛使用的SQL方言,它们在语法和功能上存在一定的差异。当需要将一个基于Oracle SQL的应用程序迁移到MySQL环境时,就需要进行SQL语句的转换工作。本项目提供了一个...

    瀚高迁移工具,迁移工具支持源端为Oracle、MySQL、SQL Server、DB2、Kingbase、DM

    迁移工具版本为hgdb-migration-v4.1.4,瀚高数据库迁移工具支持源端为Oracle、MySQL、SQL Server、DB2、KingbaseV7、KingbaseV8、DM7、DM8、HIGHGO数据库,目标端为HIGHGO、PostgreSQL数据库的自动化迁移,为了能更...

    oracle mysql sqlser2000对大数据对象的操作

    在IT领域,数据库管理系统(DBMS)如Oracle、MySQL和SQL Server 2000是处理大量数据的核心工具。这些系统对于大数据对象的操作至关重要,尤其是对于存储图像、音频、视频等非结构化数据的企业级应用。本文将深入探讨...

    SQL Server转换为MySQL工具

    1. 数据库结构迁移:在转换过程中,工具会分析SQL Server的表结构,包括字段名、字段类型、主键、外键、索引等,并在MySQL中创建相应的表结构。理解这些元数据的重要性在于确保目标数据库能正确地存储源数据库的数据...

    汉字,繁体字查询mysql和sql server数据库

    汉字,繁体字查询mysql和sql server数据库汉字,繁体字查询mysql和sql server数据库汉字,繁体字查询mysql和sql server数据库汉字,繁体字查询mysql和sql server数据库

    多数据库连接(支持MySql,Sqlserver,Oracle)

    使用这个库,开发人员可以在C#项目中快速实现对MySQL、SQL Server和Oracle数据库的连接和操作,提高了开发效率。同时,开放源码的特性允许开发者根据实际需求进行定制和扩展,增强了其灵活性和适应性。

    SQL 练习题适合ORACLE MYSQL SQL Server等

    SQL(Structured Query Language)是一种用于管理和操作数据库的强大语言,它被广泛应用于ORACLE、MYSQL、SQL Server等数据库管理系统中。本资源提供了50道SQL练习题,旨在帮助用户提升SQL技能,无论你是初学者还是...

    JDBC连接Oracle-MySQL-SQLServer数据库

    在本文中,我们将深入探讨如何使用JDBC连接Oracle、MySQL和SQLServer这三种常见的数据库。 首先,让我们详细了解一下JDBC连接Oracle数据库的过程: 1. **添加驱动**:为了与Oracle数据库通信,你需要在Java项目中...

    数据库设计和自动安装工具BDB V2.2(for Oracle/MS SQLServer/MySQL/Access/SQLAnywhere/Sybase)

    BDB是跨数据库平台的数据库设计和自动安装工具、 支持Oracle、MS SQLServer、Access、MySQL、SQLAnyWhere、Sybase数据库。 通过BDB可以快速建立数据库模型、并随时与实体数据库进行双向同步。 同时它还可以...

    oracle rownum 的使用 和sqlserver有区别的!

    - 在 SQL Server 中,ROW_NUMBER() 函数与 Oracle 中的 ROWNUM 功能类似,但它们之间存在一些关键差异。 - **ROW_NUMBER()** 可以基于特定的排序规则为每行分配一个连续的数字,这使得它在处理有序数据时更为灵活...

    Mysql_Sqlserver_oracle_BaseDemo.rar_oracle

    添加表(CREATE TABLE)、删除表(DROP TABLE)以及更改表结构(ALTER TABLE)的操作在SQL Server中也是基本操作。此外,SQL Server提供了丰富的管理工具,如SQL Server Management Studio (SSMS),使得这些任务更为...

    骂人 脏字 过滤mysql_oracle_sqlserver数据库.txt

    根据提供的文件信息,本文将详细解析“骂人脏字过滤mysql_oracle_sqlserver数据库”的相关知识点,主要包括数据库设计、敏感词库构建以及过滤机制等方面。 ### 数据库设计 #### 表结构定义 根据文件中的SQL语句,...

    Oracle 实现类似SQL Server中自增字段的一个办法

    在SQL Server中,自增字段通常通过`IDENTITY`属性实现,它会自动为新插入的行生成一个唯一的序列号。然而,在Oracle数据库系统中,没有直接对应的`IDENTITY`功能,但可以通过其他方式来模拟这个行为。这里我们将讨论...

    sql语法(oracle,mysql,sqlserver)

    根据给定的信息,我们可以深入探讨SQL中的多表查询技术,特别是针对Oracle、MySQL以及SQL Server数据库系统的应用。这里我们将重点放在几个关键的概念上:笛卡尔积、连接(Join)的不同类型,尤其是内连接(Inner ...

    oracle 到mysql转换工具

    Oracle到MySQL转换工具是一款专为数据库迁移设计的实用软件,主要功能是将Oracle数据库中的数据结构和SQL语句转换成MySQL兼容的格式,方便用户在不同的数据库系统间进行数据迁移。这款工具通常适用于那些需要从...

    mysql,sqlserver,oracle取前10条数据.docx

    在数据库查询中,取前 10 条数据是非常常见的操作,无论是在 mysql, sqlserver,还是 oracle 中,都是如此。在这里,我们将详细介绍在这三种数据库管理系统中如何取前 10 条数据。 首先,在 mysql 中,我们可以使用 ...

Global site tag (gtag.js) - Google Analytics