如何将自动增量主键添加到 MariaDB 系统版本化的 Aria 表

问题描述 投票:0回答:1

我犯了一点错误,我无法改正。我有一张表

Email
,我使用电子邮件地址作为主键。这是一个错误,我想改为向表中添加一个自动增量 ID。

但是表是System Versioned,有历史数据。出于这个原因,MariaDB 不允许我向表中添加自动增量列。

这证明了问题:

CREATE OR REPLACE TABLE `Email_Test` (
  `email` VARCHAR(100) NOT NULL,
  `modifiedBy` INT(10) UNSIGNED NOT NULL,
  `modifyReason` VARCHAR(200) NULL DEFAULT NULL,
  `Person_idPerson` INT(10) UNSIGNED NULL DEFAULT NULL,
  `Account_idAccount` INT(10) UNSIGNED NULL DEFAULT NULL,
  PRIMARY KEY (email, Account_idAccount),
  INDEX `fk_Email_Person1_idx` (`Person_idPerson` ASC),
  UNIQUE INDEX `UNIQUE` (`email` ASC, `Account_idAccount` ASC)
)
ENGINE = Aria
DEFAULT CHARACTER SET = utf8mb4
  WITH SYSTEM VERSIONING
  PARTITION BY SYSTEM_TIME (
    PARTITION part_history HISTORY,
    PARTITION part_current CURRENT
  );

INSERT INTO Email_Test SET email = '[email protected]', ModifiedBy = 3, Person_idPerson = 2, Account_idAccount = 1;
UPDATE Email_Test SET email = '[email protected]' WHERE Person_idPerson = 2;

SET @@system_versioning_alter_history = 'keep';

ALTER TABLE `Email_Test`
   DROP PRIMARY KEY,
   ADD COLUMN `idEmail` INT(10) UNSIGNED NOT NULL PRIMARY KEY FIRST;

ALTER TABLE `Email_Test`
   MODIFY COLUMN `idEmail` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;

如果省略

UPDATE
语句,它工作正常。但是,使用
UPDATE
语句会生成错误 1112 - “表 Email_Test 使用的扩展名在此 MariaDB 版本中不存在”。错误来自我们添加自动增量的第二个
ALTER TABLE
语句。

如果我们尝试在一个原子操作中添加主键和自增,也会出现同样的错误:

ALTER TABLE `Email_Test`
   DROP PRIMARY KEY,
   ADD COLUMN `idEmail` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST;

有没有一种方法可以将自动增量列添加到具有历史数据的现有系统版本化表中?

如果没有办法,您能否建议一种将现有数据(包括历史数据)暂时移动到另一个表的方法,以便在将数据复制回之前可以正确删除和创建

Email
表?

mariadb auto-increment temporal-tables
1个回答
0
投票

我设法使用 sequences 完成你的最后一步,例如:

MariaDB [test]> create sequence sIdEMail;
Query OK, 0 rows affected (0.001 sec)

MariaDB [test]> ALTER TABLE `Email_Test`    MODIFY COLUMN `idEmail` INT(10) UNSIGNED NOT NULL default(NEXTVAL(sIdEMail));
Query OK, 2 rows affected (0.003 sec)              
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [test]> select * from Email_Test;
+---------+----------------------+------------+--------------+-----------------+-------------------+
| idEmail | email                | modifiedBy | modifyReason | Person_idPerson | Account_idAccount |
+---------+----------------------+------------+--------------+-----------------+-------------------+
|       0 | [email protected] |          3 | NULL         |               2 |                 1 |
+---------+----------------------+------------+--------------+-----------------+-------------------+

MariaDB [test]> select * from Email_Test for system_time all;
+---------+----------------------+------------+--------------+-----------------+-------------------+
| idEmail | email                | modifiedBy | modifyReason | Person_idPerson | Account_idAccount |
+---------+----------------------+------------+--------------+-----------------+-------------------+
|       0 | [email protected]     |          3 | NULL         |               2 |                 1 |
|       0 | [email protected] |          3 | NULL         |               2 |                 1 |
+---------+----------------------+------------+--------------+-----------------+-------------------+

MariaDB [test]> UPDATE Email_Test SET email = '[email protected]' WHERE Person_idPerson = 2;
Query OK, 1 row affected (0.001 sec)
Rows matched: 1  Changed: 1  Inserted: 1  Warnings: 0

新值得到一个新的序列号:

MariaDB [test]> insert into Email_Test (email, modifiedBy, Account_idAccount) values ('bob@localhost', 3,4);
Query OK, 1 row affected (0.001 sec)

MariaDB [test]> select * from Email_Test;
+---------+---------------------+------------+--------------+-----------------+-------------------+
| idEmail | email               | modifiedBy | modifyReason | Person_idPerson | Account_idAccount |
+---------+---------------------+------------+--------------+-----------------+-------------------+
|       0 | [email protected] |          3 | NULL         |               2 |                 1 |
|       1 | bob@localhost       |          3 | NULL         |            NULL |                 4 |
+---------+---------------------+------------+--------------+-----------------+-------------------+
2 rows in set (0.001 sec)

任何问题,请报告bug

为什么不auto_increment?有一个非常具体的检查导致服务器代码中的

handler::update_auto_increment()
阻止 ALTER TABLE 在
NOT NULL
列上添加 auto_increment 字段。我怀疑用 auto_increment 值填充系统版本化历史记录的机制尚未实现。如果你真的想要这个,写一个错误报告(作为“任务”又名功能请求)。

© www.soinside.com 2019 - 2024. All rights reserved.