Type.ReplaceTableKeys

Type

Returns a table type with all key definitions replaced by the provided list of key records.

Examples on this page use shared sample tables. View them to understand the input data before reading the examples below.

Syntax

Type.ReplaceTableKeys(type as type, keys as list) as type

Parameters

NameTypeRequiredDescription
typetypeYesThe base table type whose keys are replaced.
keyslistYesA list of key records, each with Columns (list of text) and Primary (logical) fields. Pass an empty list to remove all keys.

Return Value

typeA new table type with the specified key definitions.

Remarks

Type.ReplaceTableKeys replaces all existing key definitions on a table type with a completely new set of keys provided as a list. Each element of the list must be a record with two fields:

- Columns — a list of column name text values forming the key - Primarytrue for the primary key, false for alternate keys

Passing an empty list ({}) removes all keys from the type.

Type.ReplaceTableKeys is the bulk-replacement counterpart to Type.AddTableKey. Use it when you want to set the complete key configuration in a single call — for example, when rebuilding a schema from scratch or applying a key set derived from external metadata. Use Type.AddTableKey when you only need to add one key at a time on top of existing keys.

Like all type functions in M, Type.ReplaceTableKeys returns a new type value — it does not modify the original. To apply the resulting type to an actual table, use Value.ReplaceType(table, newType). Use Type.TableKeys to verify the result.

Examples

Example 1: Replace existing keys with a new primary key

let
    T = #table(type table [ID = number, Name = text], {}),
    OldType = Value.Type(T),
    NewType = Type.ReplaceTableKeys(OldType, {[Columns = {"ID"}, Primary = true]}),
    Keys = Type.TableKeys(NewType)
in
    Keys{0}[Primary]
Applied Steps

The final output — reads the Primary field of the first key to confirm it is true.

Result
1TRUE

Example 2: Clear all keys by passing an empty list

let
    T = #table(type table [ID = number, Name = text], {}),
    TypeWithKey = Type.AddTableKey(Value.Type(T), {"ID"}, true),
    TypeNoKeys = Type.ReplaceTableKeys(TypeWithKey, {}),
    Keys = Type.TableKeys(TypeNoKeys)
in
    List.Count(Keys)
Applied Steps

The final output — retrieves the key list from the updated type using Type.TableKeys, then counts it to confirm zero keys remain.

Result
10

Example 3: Replace with both a primary key and an alternate key

let
    T = #table(type table [OrderID = number, Email = text, Product = text], {}),
    NewType = Type.ReplaceTableKeys(
        Value.Type(T),
        {
            [Columns = {"OrderID"}, Primary = true],
            [Columns = {"Email"}, Primary = false]
        }
    ),
    Keys = Type.TableKeys(NewType)
in
    List.Count(Keys)
Applied Steps

The final output — retrieves the key list from the new type using Type.TableKeys, then counts it to confirm two keys are present.

Result
12

Compatibility

Power BI Desktop Power BI Service Excel Desktop Excel Online Dataflows Fabric Notebooks