大家好,菜鸟求助:Mysql的问题 问题如下: 我现在有三张表 A,B,C,D 表B、C和D是空表,表A中存有以下内容

说实话,你的描述很有趣,构建块也很有趣。
让我们一步步分解,不要混淆。

1 . ENUM类型和META信息 ENUM类型在SQL中比较特殊。
它更像是数据库有界数组。
你说“可以通过SQL语句获取这个表的META信息”。
这不是问题。
您绝对可以通过使用DESCRIBE table_name或INFORMATION_SCHEMA.COLUMNS来获取ColumnA和ColumnB的ENUM类型信息。
但ENUM中的具体值无法使用这些命令直接显示。
您必须使用 SHOW COLUMNS FROM table_name。
但既然你假设它们是 ENUM,那么我们就采用这个想法。

2 生成tableb和tablec数组 这一步很关键。
如何从表B和表C生成这两个数组?你举的例子有点复杂。
比如tableb={(0,a),(1 ,b)},我理解是一个二维数组。
第一个数字是索引,第二个数字是值。
假设B表有两行,B列分别为“a”和“b”,那么可以使用SQL: 平方米 SELECT COLUMN_B AS value, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS index FROM B;
这会将表 B 中的每一行数据及其在表中的顺序(未排序时)压缩为 (index, value)。
您可以简单地使用此结果将其分配给 tableb。
tablec 也是如此。

3 将表 A 复制到表 D 这一步很简单,只需使用: 平方米 CREATE TABLE D AS SELECT FROM A;
或者如果您只想复制结构: 平方米 创建表 D 作为 A;
4 枚举类型转换 如果表A的A列和B列的值不多,可以转为ENUM。
但需要注意的是,ENUM类型的值必须预先存在于数据库中,不能动态添加。
您可以使用 SELECT DISTINCT 首先提取值,然后创建 ENUM 类型: 平方米 创建类型 enum_columnA AS ENUM ('a', 'b', 'c'); 创建表 D 作为从 A 中选择; ALTER TABLE D MODIFY COLUMN ColumnA enum_columnA;
但是 ENUM 有一个陷阱。
如果表很大,类型转换可能会很慢并且ENUM不支持NULL值(除非在定义时添加ENUM('NULL', ...))。

5 非枚举处理 如果值太高,实际上不可能将其转换为 ENUM。
这时候就需要使用程序了。
例如使用 Java: 爪哇 List listA = Arrays.asList("a", "b", "c"); // 假设该值是从列表A中获取的 Set uniqueSet = new HashSet(listA); String[] enumArray = uniqueSet.toArray(new String[0]);
然后使用该数组创建 ENUM 类型: 平方米 创建类型 enum_columnA AS ENUM ('a', 'b', 'c'); 创建表 D 作为从 A 中选择; ALTER TABLE D MODIFY COLUMN ColumnA enum_columnA;
但是说实话,这种方法不一定高效,尤其是当表A特别大的时候。
之前也遇到过类似的情况,发现直接在SQL层面操作更稳定。

6 循环更新操作 您编写的两个 for 循环似乎没有正确的目标。
你想用tableb和tablec的值来更新tableD,对吧?但逻辑必须改变。
例如tableb中的(0,a)表示将tableD中ColumnA为某个值的位置改为“a”,所以SQL应该是: 平方米 UPDATE tableD SET ColumnA = 'a' WHERE ColumnA IN (SELECT ColumnA FROM B);
而不是您编写的 where columnA = tableb[1 ] 。
tablec 也是如此。

综上所述,你所描述的想法基本上是可行的,但细节需要调整。
特别是对于非ENUM类型转换处理,可以使用程序生成ENUM类型,但是需要考虑效率。
我建议首先进行小规模测试,例如使用 1 ,000 个数据点。
如果速度慢,请考虑其他方法。
比如直接使用VARCHAR存储,然后按需查询更新。

列表数据量达到百万条 使用for循环对mysql数据库进行update时候,失败的原因