Skip to main content

Update Column

Modify existing column properties, constraints, and type-specific settings without losing data.

update()

Update an existing column's properties.

client.columns.update(tableName: string, columnName: string, updates: ColumnUpdateRequest): Promise<BolticSuccessResponse<ColumnDetails> | BolticErrorResponse>

Parameters

ParameterTypeRequiredDescription
tableNamestringName of the target table
columnNamestringName of the column to update
updatesColumnUpdateRequestProperties to update

ColumnUpdateRequest Properties

PropertyTypeDescription
descriptionstringUpdate column description
is_nullablebooleanChange nullable constraint
is_indexedbooleanAdd/remove database index
is_visiblebooleanShow/hide column in UI
default_valueanyUpdate default value for new records
Type-specific propertiesVariousBased on column type

Basic Property Updates

Update Description

const { data, error } = await client.columns.update("products", "title", {
description: "Updated product title with enhanced validation",
});

if (!error) {
console.log("Description updated:", data.description);
}

Add/Remove Constraints

// Add constraints
const { data, error } = await client.columns.update("users", "email", {
is_unique: true,
is_indexed: true,
description: "Unique email address with index for fast lookups",
});

// Remove constraints
const { data, error } = await client.columns.update("products", "description", {
is_indexed: false,
description: "Product description (index removed for performance)",
});

Update Default Values

// Set default value
const { data, error } = await client.columns.update("products", "is_active", {
default_value: true,
description: "Products are active by default",
});

// Remove default value
const { data, error } = await client.columns.update("users", "bio", {
default_value: null,
description: "User biography (no default)",
});

Type-Specific Updates

Currency Field Updates

// Change currency format
const { data, error } = await client.columns.update("products", "price", {
currency_format: "EUR",
description: "Price in Euros (changed from USD)",
});

// Update decimal precision
const { data, error } = await client.columns.update("products", "price", {
decimals: "0.000",
description: "Price with 3 decimal places for precision",
});

// Update both currency and decimals
const { data, error } = await client.columns.update("products", "price", {
currency_format: "GBP",
decimals: "0.00",
default_value: 0.0,
description: "Price in British Pounds with 2 decimal places",
});

Phone Number Field Updates

// Change phone format
const { data, error } = await client.columns.update("users", "phone", {
phone_format: "+91 123 456 7890",
description: "India phone number format",
});

// Update to US format
const { data, error } = await client.columns.update("contacts", "mobile", {
phone_format: "+1 (123) 456-7890",
description: "US phone number format with parentheses",
});

// International format
const { data, error } = await client.columns.update("customers", "phone", {
phone_format: "(123) 456-7890",
description: "International phone number format",
});
// Update dropdown options
const { data, error } = await client.columns.update("products", "category", {
selectable_items: ["Electronics", "Clothing", "Books", "Home & Garden", "Sports & Outdoors"],
description: "Expanded product categories",
});

// Change from single to multiple selection
const { data, error } = await client.columns.update("posts", "tags", {
multiple_selections: true,
description: "Allow multiple tags per post",
});

// Update default selection
const { data, error } = await client.columns.update("tickets", "priority", {
selectable_items: ["Low", "Medium", "High", "Critical"],
default_value: "Medium",
description: "Ticket priority with Medium as default",
});

Date-Time Field Updates

// Update date format
const { data, error } = await client.columns.update("logs", "created_at", {
date_format: "%d/%m/%y",
description: "European date format (day/month/year)",
});

// Update time format
const { data, error } = await client.columns.update("appointments", "start_time", {
time_format: "%I:%M %p",
description: "12-hour time format with AM/PM",
});

Number Field Updates

// Change decimal precision
const { data, error } = await client.columns.update("measurements", "weight", {
decimals: "0.000",
description: "Weight with 3 decimal precision for accuracy",
});

// Add validation range (if supported)
const { data, error } = await client.columns.update("ratings", "score", {
decimals: "0.0",
default_value: 5.0,
description: "Rating score from 1.0 to 10.0",
});

Vector Field Updates

// Update vector dimensions (requires data migration)
const { data, error } = await client.columns.update("documents", "embeddings", {
vector_dimension: 768, // Changing from 1536 to 768
description: "Reduced dimension embeddings for efficiency",
});

// Add index for similarity search
const { data, error } = await client.columns.update("images", "features", {
is_indexed: true,
description: "Image feature vectors with similarity search index",
});

Data Type Conversion

You can change a column's data type to compatible types. The system validates existing data and converts it according to the target type's format.

Supported Type Conversions

From TypeCan Convert To
textemail, long-text, date-time, number, currency, checkbox, phone-number, link, json, vector, sparsevec, halfvec
emailtext, long-text, date-time, number, currency, checkbox, phone-number, link, json, vector, sparsevec, halfvec
long-texttext, email, date-time, number, currency, checkbox, phone-number, link, json, vector, sparsevec, halfvec
date-timetext, email, long-text, phone-number, link
numbertext, email, long-text, currency, phone-number, link
currencytext, email, long-text, number, phone-number, link
checkboxtext, email, long-text, phone-number, link
dropdown(No conversions allowed)
phone-numbertext, email, long-text, date-time, number, currency, checkbox, link, json, vector, sparsevec, halfvec
linktext, email, long-text, number, currency, checkbox, phone-number, json, vector, sparsevec, halfvec
jsontext, email, long-text, phone-number, link
vectortext, email, long-text, phone-number, link, halfvec, sparsevec, vector
sparsevectext, email, long-text, phone-number, link, vector, halfvec, sparsevec
halfvectext, email, long-text, phone-number, link, vector, sparsevec, halfvec

Common Type Conversions

Convert Text to Email

// Convert a text field to email with validation
const { data, error } = await client.columns.update("users", "contact_info", {
type: "email",
is_unique: true,
is_indexed: true,
description: "User email address (converted from text)",
});

Convert Number to Currency

// Convert number field to currency format
const { data, error } = await client.columns.update("products", "price_value", {
type: "currency",
currency_format: "USD",
decimals: "0.00",
description: "Product price in USD (converted from number)",
});

Convert Text to JSON

// Convert text field to structured JSON
const { data, error } = await client.columns.update("orders", "metadata", {
type: "json",
description: "Order metadata as JSON (converted from text)",
});

Convert Text to Vector

// Convert text to vector for embeddings
const { data, error } = await client.columns.update("documents", "content", {
type: "vector",
vector_dimension: 1536,
description: "Document embeddings (converted from text)",
});

Vector Type Conversions

// Convert between vector types
const { data, error } = await client.columns.update("embeddings", "features", {
type: "halfvec", // More memory-efficient
vector_dimension: 768,
description: "Half-precision embeddings for efficiency",
});

Conversion Considerations

Data Validation

// When converting to email, existing data must be valid emails
const { data, error } = await client.columns.update("contacts", "email_text", {
type: "email",
description: "Contact email (validates existing data)",
});

if (error) {
// Handle validation errors for existing data
console.error("Conversion failed:", error.message);
// Example: "Row 15: 'invalid-email' is not a valid email address"
}

Type-Specific Properties

// When converting to currency, set currency-specific properties
const { data, error } = await client.columns.update("invoices", "amount", {
type: "currency",
currency_format: "EUR",
decimals: "0.00",
default_value: 0.0,
description: "Invoice amount in Euros",
});

Vector Dimension Changes

// Changing vector dimensions requires compatible data
const { data, error } = await client.columns.update("models", "embeddings", {
type: "vector",
vector_dimension: 512, // Changed from 1536
description: "Reduced dimension embeddings",
});

// Note: Existing vectors must be compatible with new dimensions

Conversion Restrictions

Some conversions are not allowed to prevent data loss:

// ❌ Cannot convert dropdown to other types
const { data, error } = await client.columns.update("products", "category", {
type: "text", // This will fail
});

// ❌ Cannot convert button to other types
const { data, error } = await client.columns.update("actions", "submit_btn", {
type: "text", // This will fail
});

Safe Conversion Practices

Pre-conversion Validation

// 1. Check data compatibility before conversion
const { data: column } = await client.columns.get("users", "signup_date");

// 2. Perform conversion with error handling
const { data, error } = await client.columns.update("users", "signup_date", {
type: "date-time",
date_format: "%Y-%m-%d",
time_format: "%H:%M:%S",
description: "User signup timestamp (converted from text)",
});

if (error) {
console.error("Conversion failed:", error.meta);
// Handle conversion errors appropriately
}

Gradual Migration

// For complex conversions, consider creating a new column first
await client.columns.create("users", {
name: "email_new",
type: "email",
is_nullable: true,
description: "New email column for migration",
});

// Migrate data programmatically, then rename columns if needed

Constraint Management

Making Columns Non-Nullable

// First set a default value, then make non-nullable
await client.columns.update("users", "status", {
default_value: "active",
});

// Then make it non-nullable
const { data, error } = await client.columns.update("users", "status", {
is_nullable: false,
description: "User status (required field with default)",
});

Adding Unique Constraints

// Ensure data uniqueness before adding constraint
const { data, error } = await client.columns.update("products", "sku", {
is_unique: true,
is_indexed: true, // Unique columns are automatically indexed
description: "Unique product SKU identifier",
});

Index Management

// Add index for performance
const { data, error } = await client.columns.update("orders", "customer_id", {
is_indexed: true,
description: "Customer ID with index for fast lookups",
});

// Remove index to save space
const { data, error } = await client.columns.update("logs", "debug_info", {
is_indexed: false,
description: "Debug information (index removed)",
});

Common Update Patterns

Schema Evolution

// Evolve a basic text field to email with validation
const { data, error } = await client.columns.update("users", "contact", {
type: "email", // Type conversion (if supported)
is_unique: true,
is_indexed: true,
description: "User email address (converted from text)",
});

Performance Optimization

// Add indexes to frequently queried columns
const columnsToIndex = ["category", "status", "created_date"];

for (const columnName of columnsToIndex) {
await client.columns.update("products", columnName, {
is_indexed: true,
description: `${columnName} with performance index`,
});
}

Data Quality Improvements

// Add constraints to improve data quality
const { data, error } = await client.columns.update("users", "email", {
is_unique: true,
is_nullable: false,
is_indexed: true,
description: "Required unique email address",
});

Internationalization Updates

// Update for different locales
const { data, error } = await client.columns.update("orders", "order_date", {
date_format: "%d/%m/%Y",
time_format: "%H:%M:%S",
description: "Order date in UK format and timezone",
});

Response Format

{
id: "26b364ef-0401-49b2-aae3-ebe43ae14eca",
table_id: "83c6b498-9157-483c-b872-662298ec2c38",
name: "title",
field_order: 1,
type: "text",
alignment: "left",
description: "Product title",
default_value: null,
is_primary_key: false,
is_unique: true,
is_nullable: false,
is_indexed: true,
is_visible: true,
is_readonly: false,
decimals: null,
timezone: null,
selection_source: null,
selectable_items: [],
multiple_selections: false,
phone_format: null,
date_format: null,
time_format: null,
currency_format: null,
vector_dimension: null,
created_at: '2025-08-19T09:51:12.568Z',
updated_at: '2025-08-19T09:51:18.026Z',
created_by: '[email protected]',
updated_by: '[email protected]',
}

Performance Impact

Index Operations

// Adding an index - can be slow on large tables
await client.columns.update("large_table", "search_field", {
is_indexed: true,
description: "Added index for search performance",
});

// Removing an index - usually fast
await client.columns.update("large_table", "unused_field", {
is_indexed: false,
description: "Removed unused index",
});

Constraint Changes

// Adding constraints - may require full table scan
await client.columns.update("users", "email", {
is_unique: true, // Validates all existing values
is_nullable: false, // Checks for null values
});