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
Parameter | Type | Required | Description |
---|---|---|---|
tableName | string | ✅ | Name of the target table |
columnName | string | ✅ | Name of the column to update |
updates | ColumnUpdateRequest | ✅ | Properties to update |
ColumnUpdateRequest Properties
Property | Type | Description |
---|---|---|
description | string | Update column description |
is_nullable | boolean | Change nullable constraint |
is_indexed | boolean | Add/remove database index |
is_visible | boolean | Show/hide column in UI |
default_value | any | Update default value for new records |
Type-specific properties | Various | Based 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",
});
Dropdown Field Updates
// 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 Type | Can Convert To |
---|---|
text | email, long-text, date-time, number, currency, checkbox, phone-number, link, json, vector, sparsevec, halfvec |
text, long-text, date-time, number, currency, checkbox, phone-number, link, json, vector, sparsevec, halfvec | |
long-text | text, email, date-time, number, currency, checkbox, phone-number, link, json, vector, sparsevec, halfvec |
date-time | text, email, long-text, phone-number, link |
number | text, email, long-text, currency, phone-number, link |
currency | text, email, long-text, number, phone-number, link |
checkbox | text, email, long-text, phone-number, link |
dropdown | (No conversions allowed) |
phone-number | text, email, long-text, date-time, number, currency, checkbox, link, json, vector, sparsevec, halfvec |
link | text, email, long-text, number, currency, checkbox, phone-number, json, vector, sparsevec, halfvec |
json | text, email, long-text, phone-number, link |
vector | text, email, long-text, phone-number, link, halfvec, sparsevec, vector |
sparsevec | text, email, long-text, phone-number, link, vector, halfvec, sparsevec |
halfvec | text, 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
});