apache/seatunnel · info
Column {} already exists in table {}. Skipping change column
Error message
Column {} already exists in table {}. Skipping change column operation. event: {} What it means
During schema-evolution application, when handling a change-column event, JdbcDialect checks whether the new column name already exists while the old one does not. If so, the rename/change was evidently already applied (idempotency guard), so the operation is skipped with this warning and returns without error.
Source
Thrown at seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/JdbcDialect.java:528
default void applySchemaChange(
Connection connection, TablePath tablePath, SchemaChangeEvent event)
throws SQLException {
if (event instanceof AlterTableColumnsEvent) {
for (AlterTableColumnEvent columnEvent : ((AlterTableColumnsEvent) event).getEvents()) {
applySchemaChange(connection, tablePath, columnEvent);
}
} else {
if (event instanceof AlterTableChangeColumnEvent) {
AlterTableChangeColumnEvent changeColumnEvent = (AlterTableChangeColumnEvent) event;
if (!changeColumnEvent
.getOldColumn()
.equals(changeColumnEvent.getColumn().getName())) {
if (!columnExists(connection, tablePath, changeColumnEvent.getOldColumn())
&& columnExists(
connection,
tablePath,
changeColumnEvent.getColumn().getName())) {
log.warn(
"Column {} already exists in table {}. Skipping change column operation. event: {}",
changeColumnEvent.getColumn().getName(),
tablePath.getFullName(),
event);
return;
}
}
applySchemaChange(connection, tablePath, changeColumnEvent);
} else if (event instanceof AlterTableModifyColumnEvent) {
applySchemaChange(connection, tablePath, (AlterTableModifyColumnEvent) event);
} else if (event instanceof AlterTableAddColumnEvent) {
AlterTableAddColumnEvent addColumnEvent = (AlterTableAddColumnEvent) event;
if (columnExists(connection, tablePath, addColumnEvent.getColumn().getName())) {
log.warn(
"Column {} already exists in table {}. Skipping add column operation. event: {}",
addColumnEvent.getColumn().getName(),
tablePath.getFullName(),
event);View on GitHub (pinned to cf67b549a7)
Solutions
- No action needed — the change was already applied; the warning confirms idempotent skip
- If the rename was NOT intended, verify the upstream CDC/schema-change configuration and column mapping
- Ensure only one pipeline writes schema changes to the same table to avoid duplicate events
Defensive patterns
Strategy: validation
Validate before calling
// idempotency pre-check before applying change-column
if (columnExists(conn, tablePath, newName) && !columnExists(conn, tablePath, oldName)) {
log.info("change column already applied; skip");
} Prevention
- Design schema-evolution handlers to be idempotent (check-before-alter)
- Avoid multiple pipelines writing schema changes to the same table
- Deduplicate/replay-protect CDC schema-change events
When it happens
Trigger: applySchemaChange receives an AlterTableChangeColumnEvent whose target column already exists in the target table and whose old column no longer exists — i.e. a duplicate/replayed schema-change event.
Common situations: Schema-change events replayed after checkpoint/task restart; multiple sinks or upstream connectors emitting the same rename; CDC source resending evolution history.
Understand the failure class
Background: "already exists" / EEXIST / FileAlreadyExistsException: what the 'file already exists' error means and how to fix it — this error's family across 37 libraries.
Related errors
- Column {} already exists in table {}. Skipping add column op
- Column {} does not exist in table {}. Skipping drop column o
- Table 'TablePath{databaseName='null', schemaName='null', tab
- Error executing SqlServer SQL: ${ddlSQL}
- Default value is not supported for column {} in table {}. Sk
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/dcb643e2162beb0a.
Report an issue: GitHub.