我有下面的MARIADB代码。它应该演示:
1.使用递增ID的序列构造表。
1.使用临时表+连接将数据插入到表中,同时递增ID。
程序:
1.创建序列S1和表T1。T1_ID随S1递增
1.创建序列S2和表T2。T2_ID随S2递增
- T1表已填好数据,一切正常。
1.临时表TEMP_T2已创建并填充了数据。此表中没有ID。列T1_NAME是对表T1中SHORT_NAME的交叉引用。 - 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;
2条答案
按热度按时间6tr1vspr1#
感谢您的回复。
1.我之所以使用
SEQUENCE
而不是AUTO_INCREMENT
,是因为有人告诉我,这是一种更现代的方法,它还可以检索任何特定表的最后一个ID。1.奇怪的是,这应该是一个bug。它看起来像是非常基本的功能。但它确实是...
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和更高版本中不会出现此问题。