diff --git a/packages/nocodb/src/lib/meta/api/metaDiffApis.ts b/packages/nocodb/src/lib/meta/api/metaDiffApis.ts index 3f84613bfa..eee915bb2e 100644 --- a/packages/nocodb/src/lib/meta/api/metaDiffApis.ts +++ b/packages/nocodb/src/lib/meta/api/metaDiffApis.ts @@ -34,6 +34,11 @@ export enum MetaDiffType { TABLE_VIRTUAL_M2M_REMOVE = 'TABLE_VIRTUAL_M2M_REMOVE', } +const applyChangesPriorityOrder = [ + MetaDiffType.VIEW_COLUMN_REMOVE, + MetaDiffType.TABLE_RELATION_REMOVE, +]; + type MetaDiff = { title?: string; table_name: string; @@ -549,6 +554,15 @@ export async function metaDiffSync(req, res) { // const relations = (await sqlClient.relationListAll())?.data?.list; for (const { table_name, detectedChanges } of changes) { + // reorder changes to apply relation remove changes + // before column remove to avoid foreign key constraint error + detectedChanges.sort((a, b) => { + return ( + applyChangesPriorityOrder.indexOf(b.type) - + applyChangesPriorityOrder.indexOf(a.type) + ); + }); + for (const change of detectedChanges) { switch (change.type) { case MetaDiffType.TABLE_NEW: diff --git a/packages/nocodb/src/lib/models/Column.ts b/packages/nocodb/src/lib/models/Column.ts index 82cc863b23..a235bbedcc 100644 --- a/packages/nocodb/src/lib/models/Column.ts +++ b/packages/nocodb/src/lib/models/Column.ts @@ -772,6 +772,28 @@ export default class Column implements ColumnType { await NocoCache.del(`${CacheScope.GALLERY_VIEW_COLUMN}:${col.id}`); } + // Get LTAR columns in which current column is referenced as foreign key + const ltarColumns = await ncMeta.metaList2( + null, + null, + MetaTable.COL_RELATIONS, + { + xcCondition: { + _or: [ + { fk_child_column_id: { eq: col.id } }, + { fk_parent_column_id: { eq: col.id } }, + { fk_mm_child_column_id: { eq: col.id } }, + { fk_mm_parent_column_id: { eq: col.id } }, + ], + }, + } + ); + + // Delete LTAR columns in which current column is referenced as foreign key + for (const ltarColumn of ltarColumns) { + await Column.delete(ltarColumn.fk_column_id, ncMeta); + } + // Columns await ncMeta.metaDelete(null, null, MetaTable.COLUMNS, col.id); await NocoCache.deepDel(