MonetDB - 表添加到合并表多次,无法删除或删除它
我有一个具有大约6.2亿行数据的MonetDB合并表,我们称之为merge_table
。它有14个成员表格,每个表格包含一些月度数据(例如2017年1月的data1701
)。处理将数据加载到数据库和添加/删除成员表的Java程序以某种方式设法多次将相同的表添加到合并表中。我的问题是,现在我无法从合并表中删除这些复制的表,即使MonetDB说,手术很成功:MonetDB - 表添加到合并表多次,无法删除或删除它
ALTER TABLE myschema.merge_table DROP TABLE data1708;
操作成功(0.608ms)
然后,当我尝试删除该表:
DROP TABLE myschema.data1708;
DROP TABLE:无法删除表data1708(有数据库目标W这取决于它)
当然,当我列出的成员merge_table
,data1708
仍然存在。
是否有其他方法可以用来删除这些重复项?
编辑:
MonetDB版本是23年11月25日(monetdbd [21491] 1.7(Dec2016-SP5))。 JDBC版本是2.19。
多次运行DROP TABLE命令会得到相同的结果。尝试添加任何表中再次不起作用,所以它按预期工作不JDBC:
ALTER TABLE myschema.merge_table ADD TABLE data1708;
ALTER TABLE:表“myschema.data1708”已经是MERGE表的一部分“myschema.merge_table “
我的合并表的编号是9020,于是我就建议的查询与该休息:
SELECT * FROM sys.dependencies JOIN sys.dependency_types ON depend_type = dependency_type_id WHERE depend_id = 9020; +-------+-----------+-------------+--------------------+----------------------+ | id | depend_id | depend_type | dependency_type_id | dependency_type_name | +=======+===========+=============+====================+======================+ | 9668 | 9020 | 2 | 2 | TABLE | | 9722 | 9020 | 2 | 2 | TABLE | | 9776 | 9020 | 2 | 2 | TABLE | | 9830 | 9020 | 2 | 2 | TABLE | | 9884 | 9020 | 2 | 2 | TABLE | | 9938 | 9020 | 2 | 2 | TABLE | | 13891 | 9020 | 2 | 2 | TABLE | | 13945 | 9020 | 2 | 2 | TABLE | | 13999 | 9020 | 2 | 2 | TABLE | | 14053 | 9020 | 2 | 2 | TABLE | | 14107 | 9020 | 2 | 2 | TABLE | | 14161 | 9020 | 2 | 2 | TABLE | | 14215 | 9020 | 2 | 2 | TABLE | | 14269 | 9020 | 2 | 2 | TABLE | +-------+-----------+-------------+--------------------+----------------------+
SELECT * FROM sys.objects WHERE id = 9020; +------+------------+------+ | id | name | nr | +======+============+======+ | 9020 | data1607 | 1 | | 9020 | data1608 | 2 | | 9020 | data1609 | 3 | | 9020 | data1610 | 4 | | 9020 | data1611 | 5 | | 9020 | data1612 | 6 | | 9020 | data1701 | 7 | | 9020 | data1702 | 8 | | 9020 | data1703 | 9 | | 9020 | data1704 | 10 | | 9020 | data1705 | 11 | | 9020 | data1706 | 12 | | 9020 | data1707 | 13 | | 9020 | data1707 | 12 | | 9020 | data1708 | 13 | | 9020 | data1707 | 12 | | 9020 | data1708 | 13 | +------+------------+------+
首先,为了完整,您使用的是哪个版本的MonetDB和 哪个版本的JDBC驱动程序?此外,我认为运行
ALTER TABLE myschema.merge_table DROP TABLE data1708;
第二次没有让问题消失?
我想 - 无需JDBC - 下面的脚本:
DROP SCHEMA IF EXISTS demo;
CREATE SCHEMA demo;
SET SCHEMA demo;
CREATE TABLE template (i INT, j INT);
CREATE TABLE foo (LIKE template);
INSERT INTO foo VALUES (1,10), (2,20);
CREATE TABLE bar (LIKE template);
INSERT INTO bar VALUES (3,30);
CREATE MERGE TABLE merged (LIKE template);
ALTER TABLE merged ADD TABLE foo;
ALTER TABLE merged ADD TABLE bar;
ALTER TABLE merged ADD TABLE bar;
ALTER TABLE merged DROP TABLE bar;
DROP TABLE bar;
SELECT * FROM merged;
这正常工作。也就是说,第二个'ALTER ADD bar'产生一个 错误消息,并且DROP TABLE栏成功。你可以试试 类似的东西,但使用玩具Java程序?
另外,在这样做之前,你可以窥视'sys'模式吗?在 特别
SELECT * FROM sys.tables WHERE name = 'merge_table';
弄清楚合并表的ID。
SELECT *
FROM sys.dependencies JOIN sys.dependency_types
ON depend_type = dependency_type_id
WHERE depend_id = <merge-table-id>;
和
SELECT * FROM sys.objects WHERE id = <merge-table-id>;
注意,试图修改这些表像预期的那样“修复”的事情是行不通的。我只是好奇他们目前的状态。
Joeri
嘿Joeri, 我已经编辑与查询结果我的问题。不幸的是,Java程序不是我的,但它现在正在修正,不包括某些假设。尽管问题可能出现在JDBC驱动程序中。 – bem13
您的输出确实显示了三次data1707和两次data1708。 我尝试使用JDBC 2.25和MonetDB版本 Dec2016-SP5和Jul2017但未能重现此行为。 因此,JDBC可能不是问题所在。 恐怕我没有进一步的建议了解这个 是怎么发生的。你可以做的最好的可能是重新加载数据库,并希望对你的应用程序的各种改进足以让 不会再次遇到这个问题。如果您后来发现如何欺骗 MonetDB多次添加表,请告诉我们,以便我们 可以修复它。 –
没问题,谢谢你的帮助。我们从转储中重新创建了数据库(和合并表),将程序修改了一些并更新为最新的MonetDB版本。如果我们弄清楚什么,我一定会通过邮件列表让你们知道。 – bem13