diff --git a/src/lib/dataGridSql.ts b/src/lib/dataGridSql.ts index f51632286..04291e57a 100644 --- a/src/lib/dataGridSql.ts +++ b/src/lib/dataGridSql.ts @@ -14,6 +14,7 @@ export interface DataGridColumnInfo { name: string; is_nullable: boolean; column_default?: string | null; + extra?: string | null; } export interface DataGridSaveStatementOptions { @@ -38,7 +39,11 @@ export function validateDataGridSave(options: DataGridSaveValidationOptions): st const notNullColumns = new Set( (options.columnInfo ?? []) .filter( - (column) => !column.is_nullable && !column.column_default && !isOracleRowId(options.databaseType, column.name), + (column) => + !column.is_nullable && + !column.column_default && + !isAutoGeneratedColumn(column) && + !isOracleRowId(options.databaseType, column.name), ) .map((column) => normalizeColumnName(column.name)), ); @@ -214,6 +219,10 @@ function isOracleRowId(databaseType: DatabaseType | undefined, name: string | un return databaseType === "oracle" && name?.toUpperCase() === DBX_ROWID_COLUMN; } +function isAutoGeneratedColumn(column: DataGridColumnInfo): boolean { + return /\b(auto_increment|autoincrement|identity)\b/i.test(column.extra ?? ""); +} + function isNullWriteToNotNullColumn( databaseType: DatabaseType | undefined, notNullColumns: Set, diff --git a/tests/dataGridSql.test.ts b/tests/dataGridSql.test.ts index 73378de0a..f802fd5c0 100644 --- a/tests/dataGridSql.test.ts +++ b/tests/dataGridSql.test.ts @@ -83,3 +83,18 @@ test("rejects NULL writes to non-null table columns", () => { assert.equal(error, 'Column "CREATED_AT" does not allow NULL.'); }); + +test("allows NULL for MySQL auto increment columns when inserting rows", () => { + const error = validateDataGridSave({ + databaseType: "mysql", + columns: ["id", "name"], + columnInfo: [ + { name: "id", is_nullable: false, column_default: null, is_primary_key: true, extra: "auto_increment" }, + { name: "name", is_nullable: false, column_default: null, is_primary_key: false, extra: null }, + ], + dirtyRows: [], + newRows: [[null, "Ada"]], + }); + + assert.equal(error, undefined); +});