MARIADB序列-递增2

arknldoa  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(139)

我有下面的MARIADB代码。它应该演示:
1.使用递增ID的序列构造表。
1.使用临时表+连接将数据插入到表中,同时递增ID。
程序:
1.创建序列S1和表T1。T1_ID随S1递增
1.创建序列S2和表T2。T2_ID随S2递增

  1. T1表已填好数据,一切正常。
    1.临时表TEMP_T2已创建并填充了数据。此表中没有ID。列T1_NAME是对表T1中SHORT_NAME的交叉引用。
  2. T1_ID通过联接引入到表TEMP_T2中。此SELECT的结果插入到T2中。此处,序列S2应自动递增T2_ID。
    出于某种原因,在结尾处,T2看起来像这样:
T2_ID|T1_ID|NAME|
-----+-----+----+
    2|    1|y   |
    4|    2|x   |
    6|    2|z   |

为什么T2_ID是双倍递增的?

谢谢你!

USE DB1;

SET FOREIGN_KEY_CHECKS = 0;

DROP SEQUENCE IF EXISTS `S2`;
DROP SEQUENCE IF EXISTS `S1`;
DROP TABLE IF EXISTS `T2`;
DROP TABLE IF EXISTS `T1`;

-- Create sequence S1 and able T1
CREATE SEQUENCE `S1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB;
SELECT SETVAL(`S1`, 1, 0);

CREATE TABLE `T1` (
  `T1_ID` tinyint(4) NOT NULL DEFAULT nextval(`S1`),
  `SHORT_NAME` varchar(10) NOT NULL,
  PRIMARY KEY (`T1_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

-- Create sequence T2 and table T2
CREATE SEQUENCE `S2` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB;
SELECT SETVAL(`S2`, 1, 0);

CREATE TABLE `T2` (
  `T2_ID` int(11) NOT NULL DEFAULT nextval(`S2`),
  `T1_ID` int(11) DEFAULT NULL, 
  `NAME` varchar(100) DEFAULT NULL COLLATE 'utf8mb3_bin',
  PRIMARY KEY (`T2_ID`),
  UNIQUE KEY `T2_NAME_UN` (`NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

-- Load data into T1
DELETE FROM T1;

INSERT INTO T1(SHORT_NAME) VALUES
     ('a'),
     ('b'),
     ('c');

SELECT * FROM T1;

-- Create temporary file for joining with T1
DROP TABLE IF EXISTS `TEMP_T2`;
CREATE TEMPORARY TABLE `TEMP_T2` (
  `T1_NAME` varchar(10) DEFAULT NULL,
  `NAME` varchar(100) DEFAULT NULL,
  UNIQUE KEY `T2_NAME_UN` (`NAME`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

DELETE FROM TEMP_T2 ;

-- Insert data into the temporary table
INSERT INTO TEMP_T2(T1_NAME,NAME) VALUES
     ('b','x'),
     ('a','y'),
     ('b','z');

SELECT * FROM TEMP_T2;

# Do a join with TEMP_T2 x T1 and insert into T2

INSERT INTO T2(T1_ID,NAME)
SELECT 
t1.T1_ID ,
t2.NAME
FROM TEMP_T2 AS t2
INNER JOIN T1 AS t1
  ON t2.T1_NAME =t1.SHORT_NAME ;

SELECT * FROM T2;
6tr1vspr

6tr1vspr1#

感谢您的回复。
1.我之所以使用SEQUENCE而不是AUTO_INCREMENT,是因为有人告诉我,这是一种更现代的方法,它还可以检索任何特定表的最后一个ID。
1.奇怪的是,这应该是一个bug。它看起来像是非常基本的功能。但它确实是...

wj8zmpe1

wj8zmpe12#

我在INSERT ... SELECT中发现了一个已报告的现有bug MDEV-29540,因为它与列默认值中的序列有关。
由于已报告并修复此错误,因此在10.3.37、10.4.27、10.5.18、10.6.11、10.7.7、10.8.6、10.9.4、10.10.2、10.11.1和更高版本中不会出现此问题。

相关问题