`

MySQL序列解决方案

阅读更多

本文来自: http://meetrice.iteye.com/blog/89426

 

MySQL自增长与Oracle序列的区别:
自增长只能用于表中的其中一个字段
自增长只能被分配给固定表的固定的某一字段,不能被多个表共用.
自增长会把一个未指定或NULL值的字段自动填上.

在mysql中添加序列,请看下面的实例:
在MYSQL里有这样一张表:
Java代码 复制代码

CREATE TABLE Movie(
id           INT NOT NULL AUTO_INCREMENT,
name     VARCHAR(60) NOT NULL,
released YEAR NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;

INSERT INTO Movie (name,released) VALUES ('Gladiator',2000);
INSERT INTO Movie (id,name,released) VALUES (NULL,'The Bourne Identity',1998);

在ORACLE是这样的:
Java代码 复制代码

 

CREATE TABLE Movie(
id          INT NOT NULL,
name     VARCHAR2(60) NOT NULL,
released INT NOT NULL,
PRIMARY KEY (id)
);
CREATE SEQUENCE MovieSeq;

Java代码 复制代码

INSERT INTO Movie (id,name,released) VALUES (MovieSeq.NEXTVAL,'Gladiator',2000);


在oracle下为表添加一个触发器,就可以实现mysql自增长功能:
Java代码 复制代码

 

CREATE OR REPLACE TRIGGER BRI_MOVIE_TRG
BEFORE INSERT ON Movie
FOR EACH ROW
BEGIN
  SELECT MovieSeq.NEXTVAL INTO :new.id FROM DUAL;
END BRI_MOVIE_TRG;
.
RUN;


这样,插件记录就可以成为MYSQL风格:
Java代码 复制代码

INSERT INTO Movie (name,released) VALUES ('The Lion King',1994);


下面我们来看看如何在mysql数据里使用Oracle序列语法.NEXTVAL 和 .CURVAL.
我们假设在mysql中序列的语法是:

    NEXTVAL(’sequence’);
    CURRVAL(’sequence’);
    SETVAL(’sequence’,value);


下面就是CURRRVAL的实现方案:

DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence (
name              VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment       INT NOT NULL DEFAULT 1,
PRIMARY KEY (name)
) ENGINE=InnoDB;
INSERT INTO sequence VALUES ('MovieSeq',3,5);
DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
  DECLARE value INTEGER;
  SET value = 0;
  SELECT current_value INTO value
  FROM sequence
  WHERE name = seq_name;
  RETURN value;
END$
DELIMITER ;

测试一下结果:
Java代码 复制代码

  1. +---------------------+
    | currval('MovieSeq') |
    +---------------------+
    |                   3 |
    +---------------------+
    1 row in set (0.00 sec)
    mysql> SELECT currval('x');
    +--------------+
    | currval('x') |
    +--------------+
    |            0 |
    +--------------+
    1 row in set, 1 warning (0.00 sec)
    mysql> show warnings;
    +---------+------+------------------+
    | Level   | Code | Message          |
    +---------+------+------------------+
    | Warning | 1329 | No data to FETCH |
    +---------+------+------------------+
    1 row in set (0.00 sec)



nextval

Java代码 复制代码
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
   UPDATE sequence
   SET          current_value = current_value + increment
   WHERE name = seq_name;
   RETURN currval(seq_name);
END$
DELIMITER ;


Java代码 复制代码
    mysql> select nextval('MovieSeq');
    +---------------------+
    | nextval('MovieSeq') |
    +---------------------+
    |                  15 |
    +---------------------+
    1 row in set (0.09 sec)
    
    mysql> select nextval('MovieSeq');
    +---------------------+
    | nextval('MovieSeq') |
    +---------------------+
    |                  20 |
    +---------------------+
    1 row in set (0.01 sec)
    
    mysql> select nextval('MovieSeq');
    +---------------------+
    | nextval('MovieSeq') |
    +---------------------+
    |                  25 |
    +---------------------+
    1 row in set (0.00 sec)


    setval
    Java代码 复制代码
    DROP FUNCTION IF EXISTS setval;
    DELIMITER $
    CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
    RETURNS INTEGER
    CONTAINS SQL
    BEGIN
       UPDATE sequence
       SET          current_value = value
       WHERE name = seq_name;
       RETURN currval(seq_name);
    END$
    DELIMITER ;


    Java代码 复制代码
    1. mysql> select setval('MovieSeq',150);   
    2. +------------------------+   
    3. | setval('MovieSeq',150) |   
    4. +------------------------+   
    5. |                    150 |   
    6. +------------------------+   
    7. 1 row in set (0.06 sec)   
    8.   
    9. mysql> select curval('MovieSeq');   
    10. +---------------------+   
    11. | currval('MovieSeq') |   
    12. +---------------------+   
    13. |                 150 |   
    14. +---------------------+   
    15. 1 row in set (0.00 sec)   
    16.   
    17. mysql> select nextval('MovieSeq');   
    18. +---------------------+   
    19. | nextval('MovieSeq') |   
    20. +---------------------+   
    21. |                 155 |   
    22. +---------------------+   
    23. 1 row in set (0.00 sec) 

     

     

    在my5.5版本中会出现这个错误:

    mysql ERROR 1418 (HY000) at line xx: This function has none of DETERMINISTIC

    解决它时
    1. mysql> SET GLOBAL log_bin_trust_function_creators = 1;
    2. 系統啟動時,加上--log-bin-trust-function-creators 參數為1
    3. 直接在my.ini的[mysqld]區段加上log-bin-trust-function-creators=1
    當然我想大多數人會用第三種方法,
    ok...繼續我的SP學習,good luck..

    详细解决bug地址:http://blog.myspace.cn/e/407809794.htm

     

     

    分享到:
    评论

    相关推荐

      存储问题解决方案.doc

      4. **数据库存储**:根据数据类型和查询需求,可以选择关系型数据库(如MySQL、PostgreSQL等)、NoSQL数据库(如MongoDB、Cassandra等)或时间序列数据库(如InfluxDB、TimescaleDB等)。 5. **分布式存储**:对于...

      基于 nodejs express mysql 开发的留言板 demo.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      PHP和MySQL Web开发第4版pdf以及源码

      《php和mysql web开发(原书第4版)》:开发人员专业技术丛书。 目录 读者反馈 译者序 前言 作者简介 第一篇 使用PHP 第1章 PHP快速入门教程 1.1 开始之前:了解PHP 1.2 创建一个示例应用:Bob汽车零部件商店 ...

      PHP和MySQL WEB开发(第4版)

      2.4.4 解决打开文件时可能遇到的问题 2.5 写文件 2.5.1 fwrite()的参数 2.5.2 文件格式 2.6 关闭文件 2.7 读文件 2.7.1 以只读模式打开文件:fopen() 2.7.2 知道何时读完文件:feof() 2.7.3 每次读取一行数据:fgets...

      基于C#试题库管理系统(MySQL).zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      基于Java Swing + MySQL的图书管理系统.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      C++ Qt 基于数据库Mysql学生信息管理系统.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      基于Flask + MySQL的在线请假微信小程序.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      基于Jsp+Servlet+MySQL的会员管理系统.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      MySql性能优化-通过使用XML将多次循环处理变为一次集合处理

      数据库批量操作有很多这样的应用场景,如批量通过选中的审请信息、批量插入采购单的采购清单信息等。一个公认的实事,即关系型数据库在结构化...本文将深入的分析各种解决方案,并重点介绍使用XML的方式批量更新操作。

      基于Java Swing + MySQL + JDBC 的图书管理系统.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      基于Java SpringBoot + mysql的在线图书展示商城。.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      Node、koa2、mysql 基于mpvue的网易严选商城.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      基于 jsp + servlet + mysql 三层架构实现的网上书店系统.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      基于MVC模式的简单购物车实验,JavaWeb作业。Servelet Mysql JSP .zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      koa+mysql+vue+iview 基于node前后端分离blog项目.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      RhymeSearch 疯狂押韵 - 基于Django + Mysql 的中文押韵词语搜索网站.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      基于 gin+gorm+redis+mysql 读写分离的电子商城.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      C++程序设计实践项目——学生信息管理系统,基于Qt+MySQL.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

      基于go、gorm、gin、mysql及layui构建的人力资源管理系统.zip

      自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

    Global site tag (gtag.js) - Google Analytics