Skip to main content

Execute Non Query

Executes a MySQL SQL command that does not return data (INSERT, UPDATE, DELETE, etc.).

Common Properties

  • Name - The custom name of the node.
  • Color - The custom color of the node.
  • Delay Before (sec) - Waits in seconds before executing the node.
  • Delay After (sec) - Waits in seconds after executing node.
  • Continue On Error - Automation will continue regardless of any error. The default value is false.
info

If the ContinueOnError property is true, no error is caught when the project is executed, even if a Catch node is used.

Inputs

  • Connection Id - The unique identifier of the database connection to use (optional if credentials provided directly).
  • Transaction Id - The unique identifier of a transaction (optional). Use when the command is part of a database transaction.
  • SQL Query - The SQL command to execute (INSERT, UPDATE, DELETE, CREATE, ALTER, etc.). Supports mustache template variables (e.g., {{city}}, {{userId}}).

Options

  • Credentials - MySQL database credentials (optional). Use this if you want to execute the command without a Connect node.
  • Parameters - Additional connection string parameters (optional). Only used when credentials are provided.

Output

  • None - The node does not return query results, but changes are applied to the database.

How It Works

The Execute Non Query node executes SQL commands that modify data or database structure. When executed, the node:

  1. Retrieves the database connection (either from connection ID or creates new connection from credentials)
  2. Optionally retrieves the transaction if a transaction ID is provided
  3. Processes mustache template variables in the SQL command using the message context
  4. Decodes any HTML entities in the rendered command
  5. Creates a MySqlCommand with the SQL statement
  6. Executes the command using ExecuteNonQuery
  7. Applies the changes to the database

Requirements

  • Either: A valid connection ID from Connect node OR valid database credentials
  • Valid SQL command (INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, etc.)
  • If using transactions, a valid transaction ID from Start Transaction node
  • Appropriate database permissions for the operation

Error Handling

The node will return specific errors in the following cases:

  • ErrInvalidArg - Neither connection ID nor credentials provided
  • ErrNotFound - Connection ID or transaction ID not found
  • ErrRuntime - SQL command execution failed (syntax error, constraint violation, permission denied, etc.)

Usage Examples

UPDATE Statement

UPDATE users
SET City = '{{city}}', UpdatedAt = NOW()
WHERE ID = {{userId}}

DELETE Statement

DELETE FROM orders
WHERE OrderDate < '{{cutoffDate}}'
AND Status = 'cancelled'

INSERT Statement

INSERT INTO customers (Name, Email, City, Phone, CreatedAt)
VALUES ('{{name}}', '{{email}}', '{{city}}', '{{phone}}', NOW())

Multiple INSERT

INSERT INTO products (Name, Category, Price, Stock)
VALUES
('{{product1Name}}', '{{category}}', {{price1}}, {{stock1}}),
('{{product2Name}}', '{{category}}', {{price2}}, {{stock2}}),
('{{product3Name}}', '{{category}}', {{price3}}, {{stock3}})

UPDATE with JOIN

UPDATE orders o
JOIN customers c ON o.CustomerID = c.CustomerID
SET o.CustomerEmail = c.Email
WHERE c.EmailUpdated = 1
AND o.OrderDate > '{{startDate}}'

Conditional UPDATE

UPDATE inventory
SET Stock = Stock - {{quantity}},
LastUpdated = NOW()
WHERE ProductID = {{productId}}
AND Stock >= {{quantity}}

DELETE with Subquery

DELETE FROM logs
WHERE LogID IN (
SELECT LogID FROM (
SELECT LogID
FROM logs
WHERE CreatedAt < DATE_SUB(NOW(), INTERVAL {{days}} DAY)
ORDER BY CreatedAt
LIMIT {{batchSize}}
) AS old_logs
)

Common Use Cases

  1. Data Updates - Update customer information, order status, inventory quantities
  2. Data Deletion - Remove old logs, cancelled orders, expired records
  3. Data Insertion - Add new customers, orders, products
  4. Bulk Operations - Update or delete multiple records matching criteria
  5. Data Cleanup - Archive old data, remove duplicates, normalize data
  6. Status Changes - Mark orders as shipped, users as inactive, tasks as complete
  7. Incremental Updates - Increment counters, update timestamps, adjust quantities

DDL Operations

CREATE TABLE

CREATE TABLE IF NOT EXISTS {{tableName}} (
ID INT AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(255) NOT NULL,
Email VARCHAR(255) UNIQUE,
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

ALTER TABLE

ALTER TABLE {{tableName}}
ADD COLUMN {{columnName}} {{dataType}}

DROP TABLE

DROP TABLE IF EXISTS {{tableName}}

CREATE INDEX

CREATE INDEX idx_{{indexName}}
ON {{tableName}} ({{columnName}})

Working with Template Variables

Message Context Example

{
"userId": 1001,
"city": "San Francisco",
"status": "active",
"quantity": 5,
"productId": 2501,
"email": "user@example.com",
"name": "John Doe"
}

SQL with Variables

UPDATE users
SET
City = '{{city}}',
Status = '{{status}}',
UpdatedAt = NOW()
WHERE UserID = {{userId}}

String Escaping

Mustache automatically handles values, but be careful with:

-- Good: Use template variables for values
WHERE Name = '{{name}}'

-- Avoid: SQL injection risk if building queries manually
-- Use template variables instead of string concatenation

Tips for Effective Use

  • Template Variables - Use mustache syntax {{variable}} for dynamic values
  • SQL Editor - The node provides syntax highlighting for SQL statements
  • Transactions - Use transactions for multiple related updates to ensure data consistency
  • Affected Rows - The node executes the command but doesn't return the count of affected rows
  • Batch Operations - For large datasets, process in batches to avoid timeouts
  • Direct Credentials Mode - Use the optional Credentials field to execute without a Connect node
  • Error Handling - Wrap critical updates in Try-Catch blocks
  • Testing - Test UPDATE/DELETE statements as SELECT first to verify the WHERE clause

Best Practices

Always Use WHERE Clause

-- Dangerous: Updates ALL rows
UPDATE products SET Price = Price * 1.1

-- Safe: Updates specific rows
UPDATE products
SET Price = Price * 1.1
WHERE Category = '{{category}}'

Test Before Executing

Convert UPDATE/DELETE to SELECT to verify:

-- Test first
SELECT * FROM orders
WHERE Status = 'pending' AND OrderDate < '{{cutoffDate}}'

-- Then execute
DELETE FROM orders
WHERE Status = 'pending' AND OrderDate < '{{cutoffDate}}'
Connect

Start Transaction

Non Query 1 (update inventory)

Non Query 2 (update order status)

Non Query 3 (log transaction)

Commit (or Rollback on error)

Disconnect

Batch Processing

For large updates:

// Process in batches of 1000
const batchSize = 1000;
const offset = $item.batchNumber * batchSize;
UPDATE products
SET Processed = 1
WHERE Processed = 0
LIMIT {{batchSize}}

Transaction Example

Account Transfer (Atomic Operation)

Connect

Start Transaction

Non Query 1: Deduct from Account A
UPDATE accounts
SET Balance = Balance - {{amount}}
WHERE AccountID = {{fromAccount}}
AND Balance >= {{amount}}

Non Query 2: Add to Account B
UPDATE accounts
SET Balance = Balance + {{amount}}
WHERE AccountID = {{toAccount}}

Non Query 3: Log Transaction
INSERT INTO transactions (FromAccount, ToAccount, Amount, TransactionDate)
VALUES ({{fromAccount}}, {{toAccount}}, {{amount}}, NOW())

Commit

Disconnect

Common Errors and Solutions

SQL Command Execution Failed

Error: ErrRuntime: SQL command execution failed

Common Causes:

  • Syntax error in SQL
  • Table or column doesn't exist
  • Constraint violation (UNIQUE, FOREIGN KEY, NOT NULL)
  • Permission denied
  • Invalid data type

Solutions:

  • Test SQL in MySQL client first
  • Verify table and column names
  • Check constraint requirements
  • Ensure user has appropriate permissions (UPDATE, DELETE, INSERT)
  • Validate data types match column definitions

Duplicate Entry Error

Error: Duplicate entry 'value' for key 'unique_constraint'

Solutions:

  • Use INSERT IGNORE to skip duplicates
  • Use INSERT ... ON DUPLICATE KEY UPDATE to update on conflict
  • Check for existing records before inserting
  • Use UPDATE instead of INSERT if record might exist

Foreign Key Constraint Violation

Error: Cannot add or update a child row: foreign key constraint fails

Solutions:

  • Verify the referenced record exists in the parent table
  • Insert parent record first, then child
  • Use transactions to ensure referential integrity
  • Check foreign key relationships

Deadlock Detected

Error: Deadlock found when trying to get lock

Solutions:

  • Use transactions with proper isolation levels
  • Keep transactions short
  • Access tables in consistent order
  • Retry the operation after a delay

Advanced Examples

Upsert (Insert or Update)

INSERT INTO users (UserID, Name, Email, City)
VALUES ({{userId}}, '{{name}}', '{{email}}', '{{city}}')
ON DUPLICATE KEY UPDATE
Name = VALUES(Name),
Email = VALUES(Email),
City = VALUES(City),
UpdatedAt = NOW()

Conditional Insert

INSERT INTO inventory (ProductID, Quantity)
SELECT {{productId}}, {{quantity}}
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM inventory
WHERE ProductID = {{productId}}
)

Bulk Update with CASE

UPDATE products
SET Price = CASE
WHEN Category = 'Electronics' THEN Price * 1.15
WHEN Category = 'Clothing' THEN Price * 1.10
WHEN Category = 'Food' THEN Price * 1.05
ELSE Price
END
WHERE PriceUpdateDate < '{{lastUpdateDate}}'

Archive Old Records

-- Insert into archive table
INSERT INTO orders_archive
SELECT * FROM orders
WHERE OrderDate < DATE_SUB(NOW(), INTERVAL {{months}} MONTH)
AND Status = 'completed'

-- Then delete from main table
DELETE FROM orders
WHERE OrderDate < DATE_SUB(NOW(), INTERVAL {{months}} MONTH)
AND Status = 'completed'

Performance Considerations

  • Indexes - Ensure WHERE clause columns are indexed
  • Batch Size - Limit large operations using LIMIT
  • Locks - UPDATE/DELETE acquire row locks; keep transactions short
  • Cascades - Be aware of foreign key cascades affecting performance
  • Triggers - Know if triggers will fire on UPDATE/INSERT/DELETE

See Also