在 oracle 中, sequence 提供多表多字段可共用一个不重复值。 Mysql 中存在自增列,基本可以满足 PK 的要求。但自增列存在限制:
a. 只能用于表中的一个字段,一张不能同时存在两个以上的自增列 ;
b. 自增列必须被定义为 key ( PK 或 FK ) ;
c. 自增列不能被多个表共用 ;
d. 当 insert 语句不包括自增字段或将其值设置为 NULL 时,该值会自动填上。
在不要求字段顺序递增的情况下,可以在 Mysql 中实现序列:
Sql code 5-1:
DROP TABLE IF EXISTS sequence;
-- 建sequence表,指定seq列为无符号大整型,可支持无符号值:0(default)到18446744073709551615(0到2^64–1)。
CREATE TABLE sequence (
name VARCHAR(50) NOT NULL,
current_value BIGINT UNSIGNED NOT NULL DEFAULT 0,
increment INT NOT NULL DEFAULT 1,
PRIMARY KEY (name) -- 不允许重复seq的存在。
) ENGINE=InnoDB;
DELIMITER /
DROP FUNCTION IF EXISTS currval /
CREATE FUNCTION currval(seq_name VARCHAR(50))
RETURNS BIGINT
BEGIN
DECLARE value BIGINT;
SELECT current_value INTO value
FROM sequence
WHERE upper(name) = upper(seq_name); -- 大小写不区分.
RETURN value;
END;
/
DELIMITER ;
DELIMITER /
DROP FUNCTION IF EXISTS nextval /
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS BIGINT
BEGIN
DECLARE value BIGINT;
UPDATE sequence
SET current_value = current_value + increment
WHERE upper(name) = upper(seq_name);
RETURN currval(seq_name);
END;
/
DELIMITER ;
DELIMITER /
DROP FUNCTION IF EXISTS setval /
CREATE FUNCTION setval (seq_name VARCHAR(50), value BIGINT)
RETURNS BIGINT
BEGIN
UPDATE sequence
SET current_value = value
WHERE upper(name) = upper(seq_name);
RETURN currval(seq_name);
END;
/
DELIMITER ;
在 SQL 中使用序列:
Sql code 5-2:
[c-sharp] view plaincopy
创建序列,往sequence表插入值即可:
mysql> insert into sequence set name='myseq';
查看当前已建序列:
mysql> select * from sequence;
+-------+---------------+-----------+
| name | current_value | increment |
+-------+---------------+-----------+
| myseq | 0 | 1 |
+-------+---------------+-----------+
1 row in set (0.00 sec)
获得序列的下一个值,第一次使用,因此值为1:
mysql> select nextval('myseq');
+------------------+
| nextval('myseq') |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
在存储过程中使用序列(以 sql code 1-1 中创建的 testproc 表为例),此存储过程返回插入后的 ID ,如果插入失败,则返回 -1 :
sql code 5-3:
[c-sharp] view plaincopy
create procedure test_sequence(IN i_name VARCHAR(100),
OUT o_ret BIGINT)
BEGIN
DECLARE EXIT HANDLER FOR SQLWARNING,NOT FOUND,SQLEXCEPTION set o_ret = -1;
set o_ret = nextval('myseq');
INSERT INTO testproc VALUES (o_ret,i_name);
INSERT INTO testproc3 VALUES (o_ret,i_name);
END;
转载地址:http://blog.csdn.net/crazylaa/article/details/5368447
分享到:
相关推荐
通过这种方式,我们可以利用MySQL数据库配合Java代码实现类似于Oracle Sequence的功能,同时适应分布式场景,保证并发安全。需要注意的是,这种方法可能需要根据实际的并发量和性能需求进行调整,例如调整每次获取的...
《PostgreSQL与MySQL的比较研究初探》这篇文章探讨了两种主流的开源数据库系统——PostgreSQL和MySQL之间的差异,主要从标识列、字符串类型、JSP/Servlet开发中的中文处理、多平台支持和性能等方面进行了综合分析。...
首先,Hive的元数据存储在RDBMS(关系数据库管理系统)中,如MySQL和DERBY。MySQL由于其稳定性和强大的性能,常被用作生产环境的元数据库。然而,在开发和测试环境中,DERBY因其轻量级和易于管理的特性,常被选为...
### 辛星笔记之InnoDB事务知识点解析 #### 第一节:概述 ##### 简介 - **事务(Transaction)定义**: 在数据库系统中,事务是作为一个...这些机制共同作用,使得InnoDB成为MySQL中最常用且功能强大的存储引擎之一。
案例中的部分内容虽然提到的是MySQL数据库的内部实现细节,但其中的原理和技术对于理解JVM问题定位也非常有帮助,尤其是当涉及到多线程、锁机制以及内存管理等主题时。 #### 三、InnoDB核心概念解析 1. **Mini-...
在本篇“2023年Java相关课程系列笔记之十四Hibernate学习笔记”中,我们将深入探讨Java开发中常用的持久化框架——Hibernate。这个框架由梁建全老师主讲,旨在帮助开发者更高效、便捷地进行数据库操作,弥补JDBC在...
存储过程的创建语法通常包括`CREATE OR REPLACE PROCEDURE`以及具体的逻辑实现。 ##### 5.3 CASE语句 CASE语句用于条件分支控制: ```sql CASE WHEN condition THEN -- 条件成立时执行的代码 ELSE -- 条件不成立...
### SSH命令资料——常用知识点详解 #### 一、SSH简介及重要性 SSH(Secure Shell)是一种网络协议,用于计算机之间的加密登录。它为数据通信提供了安全性的保障,尤其是在远程登录场景下,能够有效防止数据窃听、...
- **hibernate.properties**:此文件主要用于存储Hibernate运行时所需要的配置信息,例如数据库连接信息、日志级别设置等。 - **hibernate.cfg.xml**:这是Hibernate的核心配置文件,其中包含了数据库连接信息、使用...
InnoDB存储引擎是MySQL数据库中广泛使用的事务型存储引擎,其强大的事务处理能力和高可用性离不开日志系统的支持。日志系统主要包括两种类型:Undo Log和Redo Log,它们协同工作以确保事务的原子性、一致性、隔离性...
简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 常见的数据模型 1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS...