三、MySQL替代Oracle序列以及⾃增长处理
⼀、MySQL 替代 Oracle 序列以及⾃增长处理
什么是⾃增长?
⾃增长只能⽤于表中的其中⼀个字段。
⾃增长只能被分配给固定表的固定的某⼀字段,不能被多个表共⽤。
⾃增长会把⼀个未指定或NULL值的字段⾃动填上。
⼀、在 Oracle 中如何实现 MySQL 的⾃增长?
请看下⾯的实例:
1-1、在 MYSQL ⾥有这样⼀张表:
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);
1-2、在 ORACLE 是这样的使⽤序列对象+触发器来完成 MySQL 的⾃增长功能
CREATE TABLE Movie(
id          INT NOT NULL,
name    VARCHAR2(60) NOT NULL,
released INT NOT NULL,
PRIMARY KEY (id)
);
CREATE SEQUENCE MovieSeq;
INSERT INTO Movie (id,name,released) VALUES (MovieSeq.NEXTVAL,'Gladiator',2000);
在 Oracle 下为表添加⼀个触发器,就可以实现 MySQL ⾃增长功能:
1\.  CREATE OR REPLACE TRIGGER BRI_MOVIE_TRG
2\.  BEFORE INSERT ON Movie
3\.  FOR EACH ROW
4\.  BEGIN
5\.  SELECT MovieSeq.NEXTVAL INTO :new.id FROM DUAL;
6\.  END BRI_MOVIE_TRG;
7\.  .
8\.  RUN;
这样,插⼊记录就可以成为 MYSQL 风格:
INSERT INTO Movie (name,released) VALUES ('The Lion King',1994);
下⾯我们来看看如何在 mysql 数据⾥使⽤ Oracle 序列语法 .NEXTVAL 和 .CURVAL。
⼆、MySQL 如何实现 Oracle 序列?
⼀般使⽤序列 (Sequence) 来处理主键字段,在 MySQL中 是没有序列的,但是 MySQL有提供了⾃增长 (increment) 来实现类似的⽬
的,但也只是⾃增,⽽不能设置步长、开始索引、是否循环等,最重要的是⼀张表只能由⼀个字段使⽤⾃增,但有的时候我们需要两个或两个以上的字段实现⾃增(单表多字段⾃增),MySQL本⾝是实现不了的,但我们可以⽤创建⼀个序列表,使⽤函数来获取序列的值。
我们假设在 MySQL 中序列的语法是:
NEXTVAL(’sequence’);
CURRVAL(’sequence’);
SETVAL(’sequence’,value);css3选择器主要有几种方式
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);
测试⼀下结果:
测试 currval 函数使⽤
/* currval 函数的实现 */
DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
DECLARE value INTEGER;
SET value = 0;
java汉字转unicode编码
SELECT current_value INTO value
FROM sequence
WHERE name = seq_name;
RETURN value;
END$
DELIMITER ;
1\.  mysql> SELECT currval('MovieSeq');
2\.  +---------------------+
3\.  | currval('MovieSeq') |
4\.  +---------------------+
5\.  |                  3 |
6\.  +---------------------+
7\.  1 row in set (0.00 sec)
8\.  mysql> SELECT currval('x');
9\.  +--------------+
10\.  | currval('x') |
11\.  +--------------+
12\.  |            0 |
13\.  +--------------+
14\.  1 row in set, 1 warning (0.00 sec)
15\.  mysql> show warnings;
16\.  +---------+------+------------------+
17\.  | Level  | Code | Message          |
18\.  +---------+------+------------------+
19\.  | Warning | 1329 | No data to FETCH |
20\.  +---------+------+------------------+
21\.  1 row in set (0.00 sec)
测试 nextval 函数使⽤
/* nextval 函数的实现 */
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 ;
1\.  mysql> select nextval('MovieSeq');
2\.  +---------------------+
3\.  | nextval('MovieSeq') |
4\.  +---------------------+
5\.  |                  15 |
6\.  +---------------------+
7\.  1 row in set (0.09 sec)
9\.  mysql> select nextval('MovieSeq');
10\.  +---------------------+
11\.  | nextval('MovieSeq') |
12\.  +---------------------+
13\.  |                  20 |
14\.  +---------------------+
15\.  1 row in set (0.01 sec)
17\.  mysql> select nextval('MovieSeq');
18\.  +---------------------+
19\.  | nextval('MovieSeq') |
20\.  +---------------------+
21\.  |                  25 |
22\.  +---------------------+
23\.  1 row in set (0.00 sec)
测试 setval 函数的使⽤
/* setval 函数的实现 */
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 ;
1\.  mysql> select setval('MovieSeq',150);
2\.  +------------------------+
3\.  | setval('MovieSeq',150) |
4\.  +------------------------+
5\.  |                    150 |
饿了吗招聘信息6\.  +------------------------+
7\.  1 row in set (0.06 sec)
9\.  mysql> select curval('MovieSeq');
10\.  +---------------------+
11\.  | currval('MovieSeq') |
二进制和十进制之间的相互转换
12\.  +---------------------+
13\.  |                150 |
14\.  +---------------------+
15\.  1 row in set (0.00 sec)
17\.  mysql> select nextval('MovieSeq');
18\.  +---------------------+
19\.  | nextval('MovieSeq') |
20\.  +---------------------+
21\.  |                155 |
22\.  +---------------------+
23\.  1 row in set (0.00 sec)
三、MySQL 替代 Oracle 序列实例:
1、问题场景:
⼀般使⽤序列 (Sequence) 来处理主键字段,在 MySQL中 是没有序列的,但是 MySQL有提供了⾃增
长 (increment) 来实现类似的⽬的,但也只是⾃增,⽽不能设置步长、开始索引、是否循环等,最重要的是⼀张表只能由⼀个字段使⽤⾃增,但有的时候我们需要两个或两个以上的字段实现⾃增(单表多字段⾃增),MySQL本⾝是实现不了的,但我们可以⽤创建⼀个序列表,使⽤函数来获取序列的值。
-- MySQL 给数据表某个字段创建序列。
-- 序列:⾃增(步长、开始索引、是否循环),暂不考虑是否循环⾃增(触发器可实现?)
select * from PAN_WF_HISTORYNODE;-- ORDER_NUMBER 字段创建序列
-- 创建代替序列的数据表
DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence (
name              VARCHAR(50) NOT NULL, -- 序列名称 50个字符最⼤值问题已够⽤,暂不考虑是否循环。
current_value INT NOT NULL,  -- 当前值
increment      INT NOT NULL DEFAULT 1,  -- 步长
PRIMARY KEY (name)
) ENGINE=InnoDB;
INSERT INTO sequence VALUES ('seq_hisnode',0,1);
-- 处理 序列的 currval 函数
Set global log_bin_trust_function_creators=1;-- 解决⾃定义函数报错:ERROR 1418-This function has none of DETERMINISTIC
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 ;
SELECT currval('seq_hisnode');-- 测试该函数的使⽤。
-- 处理序列的 nextval 函数
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
UPDATE sequence
currentregion是什么意思
SET          current_value = current_value + increment
WHERE name = seq_name;mysql语句转oracle
RETURN currval(seq_name);
END$
DELIMITER ;
select nextval('seq_hisnode');
INSERT into PAN_WF_HISTORYNODE values()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。