MonetDB中merge table添加带主键普通表失败及相关问题求助
常见问题解答
向新建的merge table中添加普通表时,被添加的表是否需要为空?
不需要。MonetDB允许把已有数据的普通表加入merge table,只要表的结构(列名、数据类型、约束定义等)和merge table完全匹配就行。若被添加的表包含identity列(定义为
int next value for "monetdb"."seq_nnnn"),merge table是否需要对应列?序列需使用相同的还是新建?
merge table必须定义对应的列,数据类型要和子表的identity列一致(比如int),但不用在merge table里加next value for的序列定义——因为identity序列是由每个子表单独维护的,merge table只是逻辑聚合层,不直接管序列的生成。序列可以共用同一个,也可以每个子表新建独立的:用同个序列要注意不同子表插入时的序列值连续性;用独立序列的话,子表间的identity值可能重复,根据业务需求选就行。被添加表的索引和约束是否需要在merge table中复制?
不需要。merge table是逻辑上的聚合表,实际数据都存在各个子表里,子表的索引、主键、约束都会正常生效,查询merge table的时候会自动用到子表的索引。merge table本身完全没必要复制这些定义。
主键匹配报错的解决办法
你碰到的ALTER MERGE TABLE: to be added table key doesn't match MERGE TABLE definition错误,问题出在merge table的主键定义和要添加的子表不一致。
解决步骤:
- 先确认子表
movcassa_m1的主键具体定义(比如主键列是id int PRIMARY KEY) - 创建merge table的时候,必须显式定义和子表完全一致的主键结构,不能只建空结构或者不带主键的merge table。示例代码:
-- 子表创建示例 CREATE TABLE movcassa_m1 ( id int PRIMARY KEY next value for "monetdb"."seq_1234", col1 varchar(50), col2 int ); -- 创建和子表结构(含主键)完全匹配的merge table CREATE MERGE TABLE movcassa_merge ( id int PRIMARY KEY, col1 varchar(50), col2 int ); -- 执行添加操作 ALTER TABLE movcassa_merge ADD TABLE movcassa_m1;
注意:merge table的主键定义只需要和子表匹配列名、数据类型、约束类型就行,不用带上next value for的序列部分,因为序列是子表的专属属性。
这么操作之后,子表的主键约束会保留,既能顺利把表加入merge table,也能满足数据插入时的主键校验要求。
内容的提问来源于stack exchange,提问作者slamarca

