2017-07-25 78 views
0

我有一個具有大約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_tabledata1708仍然存在。

是否有其他方法可以用來刪除這些重複項?

編輯:

MonetDB版本是23年11月25日(monetdbd [21491] 1.7(Dec​​2016-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 | +------+------------+------+

回答

0

首先,爲了完整,您使用的是哪個版本的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

+0

嘿Joeri, 我已經編輯與查詢結果我的問題。不幸的是,Java程序不是我的,但它現在正在修正,不包括某些假設。儘管問題可能出現在JDBC驅動程序中。 – bem13

+0

您的輸出確實顯示了三次data1707和兩次data1708。 我嘗試使用JDBC 2.25和MonetDB版本 Dec2016-SP5和Jul2017但未能重現此行爲。 因此,JDBC可能不是問題所在。 恐怕我沒有進一步的建議瞭解這個 是怎麼發生的。你可以做的最好的可能是重新加載數據庫,並希望對你的應用程序的各種改進足以讓 不會再次遇到這個問題。如果您後來發現如何欺騙 MonetDB多次添加表,請告訴我們,以便我們 可以修復它。 –

+0

沒問題,謝謝你的幫助。我們從轉儲中重新創建了數據庫(和合並表),將程序修改了一些並更新爲最新的MonetDB版本。如果我們弄清楚什麼,我一定會通過郵件列表讓你們知道。 – bem13