diff --git a/mayfly_go_web/src/views/ops/db/DbList.vue b/mayfly_go_web/src/views/ops/db/DbList.vue index c24de0da..1a4e07b3 100644 --- a/mayfly_go_web/src/views/ops/db/DbList.vue +++ b/mayfly_go_web/src/views/ops/db/DbList.vue @@ -566,7 +566,7 @@ const dump = (db: string) => { const onShowRollbackSql = async (sqlExecLog: any) => { const columns = await dbApi.columnMetadata.request({ id: sqlExecLog.dbId, db: sqlExecLog.db, tableName: sqlExecLog.table }); - const primaryKey = columns[0].columnName; + const primaryKey = getPrimaryKey(columns); const oldValue = JSON.parse(sqlExecLog.oldValue); const rollbackSqls = []; @@ -596,6 +596,14 @@ const onShowRollbackSql = async (sqlExecLog: any) => { state.rollbackSqlDialog.visible = true; }; +const getPrimaryKey = (columns: any) => { + const col = columns.find((c: any) => c.columnKey == 'PRI'); + if (col) { + return col.columnName; + } + return columns[0].columnName; +} + /** * 包装值,如果值类型为number则直接返回,其他则需要使用''包装 */ diff --git a/server/internal/db/application/meta.go b/server/internal/db/application/meta.go index 677388d2..2459e612 100644 --- a/server/internal/db/application/meta.go +++ b/server/internal/db/application/meta.go @@ -14,7 +14,7 @@ type DbMetadata interface { // 表名: tableName, 列名: columnName, 列类型: columnType, 备注: columnComment, 是否可为null: nullable, 其他信息: extra GetColumns(tableNames ...string) []map[string]interface{} - // 获取表主键字段名,目前默认第一个字段 + // 获取表主键字段名,没有主键标识则默认第一个字段 GetPrimaryKey(tablename string) string // 获取表信息,比GetTables获取更详细的表信息 diff --git a/server/internal/db/application/mysql_meta.go b/server/internal/db/application/mysql_meta.go index 2d5762a0..e45e5203 100644 --- a/server/internal/db/application/mysql_meta.go +++ b/server/internal/db/application/mysql_meta.go @@ -53,12 +53,18 @@ func (mm *MysqlMetadata) GetColumns(tableNames ...string) []map[string]interface return result } -// 获取表主键字段名,默认第一个字段 +// 获取表主键字段名,不存在主键标识则默认第一个字段 func (mm *MysqlMetadata) GetPrimaryKey(tablename string) string { columns := mm.GetColumns(tablename) if len(columns) == 0 { panic(biz.NewBizErr(fmt.Sprintf("[%s] 表不存在", tablename))) } + for _, v := range columns { + if v["columnKey"].(string) == "PRI" { + return v["columnName"].(string) + } + } + return columns[0]["columnName"].(string) } diff --git a/server/internal/db/application/pgsql_meta.go b/server/internal/db/application/pgsql_meta.go index 26da0d07..1e1ba2bc 100644 --- a/server/internal/db/application/pgsql_meta.go +++ b/server/internal/db/application/pgsql_meta.go @@ -22,6 +22,7 @@ const ( A.attname AS "columnName", tc.is_nullable AS "nullable", concat_ws ( '', t.typname, SUBSTRING ( format_type ( a.atttypid, a.atttypmod ) FROM '\(.*\)' ) ) AS "columnType", + (CASE WHEN ( SELECT COUNT(*) FROM pg_constraint WHERE conrelid = a.attrelid AND conkey[1]= attnum AND contype = 'p' ) > 0 THEN 'PRI' ELSE '' END ) AS columnKey, d.description AS "columnComment" FROM pg_attribute a LEFT JOIN pg_description d ON d.objoid = a.attrelid @@ -65,12 +66,17 @@ func (pm *PgsqlMetadata) GetColumns(tableNames ...string) []map[string]interface return result } -// 获取表主键字段名,默认第一个字段 func (pm *PgsqlMetadata) GetPrimaryKey(tablename string) string { columns := pm.GetColumns(tablename) if len(columns) == 0 { panic(biz.NewBizErr(fmt.Sprintf("[%s] 表不存在", tablename))) } + for _, v := range columns { + if v["columnKey"].(string) == "PRI" { + return v["columnName"].(string) + } + } + return columns[0]["columnName"].(string) }