对于刚从Oracle转向MySql的人都会为,MySql中没有Oracle里的Sequence而感到困惑。MySql中没有了Sequence,那么MySql的主键用什么方式来实现最好呢?
主要有以下几种方式:
1、自增字段作为主键。【推荐方案】
MySql虽然比Oracle少了Sequence,但是多了字段的自增长特性。
插入完了以后可以通过执行【SELECT @@IDENTITY】获取上一条插入语句中生成的自增长字段的值。
这个语句很特别,没有关联到特定的SQL语句,会 让人感觉迷糊,他到底是怎么获取值的。在并发情况下会不会获取其他线程执行后的值。
答案是有可能的,但是不用怕、是可控的。只有不当的编码才会导致取到其他线程的值。先来说一下原理:
- SUMMARY
- The Jet OLE DB version 4.0 provider supports the SELECT @@Identity query that allows you to retrieve the value of the auto-increment field generated on your connection. Auto-increment values used on other connections to your database do not affect the results of this specialized query. This feature works with Jet 4.0 databases but not with older formats.
大致意思是【SELECT @@IDENTITY】获取的是当前数据库连接的前一次执行的值。其他连接执行的值不会影响当前线程。时下流行的框架(如Spring-jdbc、mybatis、hibernate)的数据库连接都是存在ThreadLocal中的、是线程隔离的,所以不会获取到其他线程中的【SELECT @@IDENTITY】值。当多线程编程时、强制把数据库连接传给各个线程同时执行时才会取到其他线程的【SELECT @@IDENTITY】。
2、在MySql中模拟Sequence
第一步:创建--Sequence 管理表
- DROP TABLE IF EXISTS sequence;
- CREATE TABLE WFO_SEQ(
- name VARCHAR(50) NOT NULL,
- current_value INT NOT NULL,
- increment INT NOT NULL DEFAULT 1,
- PRIMARY KEY (name)
- ) ENGINE=InnoDB;
第二步:创建--取当前值的函数
- DROP FUNCTION IF EXISTS currval;
- DELIMITER $
- CREATE FUNCTION currval (seq_name VARCHAR(50))
- RETURNS INTEGER
- LANGUAGE SQL
- DETERMINISTIC
- CONTAINS SQL
- SQL SECURITY DEFINER
- COMMENT ''
- BEGIN
- DECLARE value INTEGER;
- SET value = 0;
- SELECT current_value INTO value
- FROM WFO_SEQ
- WHERE name = seq_name;
- RETURN value;
- END
- $
- DELIMITER ;
第三步:创建--取下一个值的函数
- DROP FUNCTION IF EXISTS nextval;
- DELIMITER $
- CREATE FUNCTION nextval (seq_name VARCHAR(50))
- RETURNS INTEGER
- LANGUAGE SQL
- DETERMINISTIC
- CONTAINS SQL
- SQL SECURITY DEFINER
- COMMENT ''
- BEGIN
- DECLARE C_V INTEGER;
- UPDATE WFO_SEQ SET CURRENT_VALUE = CURRENT_VALUE + INCREMENT WHERE NAME = SEQ_NAME;
- SET C_V = CURRVAL(SEQ_NAME);
- IF C_V = -1 THEN
- INSERT INTO WFO_SEQ(NAME, CURRENT_VALUE, INCREMENT)
- VALUES(SEQ_NAME, 1, 1);
- RETURN 1;
- END IF;
- RETURN C_V;
- END
- $
- DELIMITER ;
第四步:创建--更新当前值的函数
- DROP FUNCTION IF EXISTS setval;
- DELIMITER $
- CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
- RETURNS INTEGER
- LANGUAGE SQL
- DETERMINISTIC
- CONTAINS SQL
- SQL SECURITY DEFINER
- COMMENT ''
- BEGIN
- UPDATE WFO_SEQ
- SET current_value = value
- WHERE name = seq_name;
- RETURN currval(seq_name);
- END
- $
- DELIMITER ;
第五步:测试函数功能
SELECT SETVAL('TestSeq', 10);---设置指定sequence的初始值
SELECT CURRVAL('TestSeq');--查询指定sequence的当前值
SELECT NEXTVAL('TestSeq');--查询指定sequence的下一个值
相关推荐
用触发器设置db2 字段自增长,我已经测试过了,很好用
1.django自定义字段类型,实现非主键字段的自增 # -*- encoding: utf-8 -*- from django.db.models.fields import Field, IntegerField from django.core import checks, exceptions from django.utils.translation ...
OLEDB驱动程序大全 MySQL-OleDB-Provider
数据迁移工具,包含DB2DB、mysql to oracle工具。其中DB2DB工具不包含oracle,mysql to oracle仅有这两种。
sakila-db.zip sakila db mysql 示例数据库 database 英语不好,想学mysql的加我好友哦
DB.class.php mysql 连接数据库代码DB.class.php mysql 连接数据库代码DB.class.php mysql 连接数据库代码
不支持PDO 、MYSQLI的空间也可以用ZEND框架了 解包后到 Zend 的框架目录 library\Zend\Db 在PHP程序里 $db = Zend_Db::factory('Mysql', $params); 即把原来的 PDO_MYSQL 等改成 Mysql
mysql *db; (3)在需要调用mysql操作类的窗口源文件.cpp的构造函数中实例化mysql: db=new mysql(); db->connect("127.0.0.1","3306","root","123456","qt"); (4)插入数据方法:db->insert(dataList,false); ...
HCIP-GaussDB for MySQL题库 2023年八月最新题库 80%题库覆盖率,全网最高 需要其他题库评论联系
DB数据库与mysql数据库之间的转换工具,英文版
这个程序是用来比较两个MySQL数据库结构差异的 比较的对象包括:表、索引、视图、存储过程、函数、触发器、事件 提示了新增表的,则不提示新增表相关的索引与触发器 程序的相同目录下必须有配置文件:CompareMySQL....
Ansible mysql_db 模块的安装,问题及解决方案,以及参数说明。开始时提示模块无法使用是因为依赖包mysqldb没有安装。解决办法是安装依赖包。安装后提示错误是因为登录用户无法免官登录mysql。解决办法是指定登录...
命令:insert into <表名> [( <字段名1>[,..<字段名n > ])] values ( 值1 )[, ( 值n )] 例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99,...
数据库操作类(支持OleDb、MySQL、Oracle、SQL、SQLite、) 操作: 获取连接字符串 得到web.config里配置项的数据库连接字符串。 数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库. ...
使用 DTS 需要预先创建好数据表 否则新迁移的数据库是没有主键的 而 mss2sql 工具可以解决以上问题 但转换速度非常慢 我需要转换 3000 万的数据 在一台相当不错的服务器上面 也需要几天几夜才能转换完成 而 DB2DB ...
从DB2的数据库把表导入到MYSQL中,导入Myeclipse中即可。
最新版的mysql 测试数据库
mysql sample db file mysql sample db file
DB MySQL x64 v5.7.17 便携版 DB MySQL x64 v5.7.17 Portable
DB2 代码如下:CREATE TABLE T1( id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1 MINVALUE 1 NO MAXVALUE NO CYCLE NO CACHE ORDER ), …); Oracle(需要创建...