diff --git a/SQLSchemaCompare.Core/Entities/Database/ABaseDbIndex.cs b/SQLSchemaCompare.Core/Entities/Database/ABaseDbIndex.cs index bb5247b..7e571ef 100644 --- a/SQLSchemaCompare.Core/Entities/Database/ABaseDbIndex.cs +++ b/SQLSchemaCompare.Core/Entities/Database/ABaseDbIndex.cs @@ -14,6 +14,11 @@ public class ABaseDbIndex : ABaseDbConstraint /// Used only by the DatabaseProvider to group the indexes and fill the ColumnDescending list public bool IsDescending { get; set; } + /// + /// Gets or sets the length of the prefix. + /// + public long? PrefixLength { get; set; } + /// /// Gets or sets a value indicating whether the index is included. /// @@ -24,6 +29,11 @@ public class ABaseDbIndex : ABaseDbConstraint /// public List ColumnDescending { get; } = []; + /// + /// Gets the column prefix lengths. + /// + public List ColumnPrefixLengths { get; } = []; + /// /// Gets the included columns. /// diff --git a/SQLSchemaCompare.Infrastructure/DatabaseProviders/ADatabaseProvider.cs b/SQLSchemaCompare.Infrastructure/DatabaseProviders/ADatabaseProvider.cs index 97f926b..1daa6b2 100644 --- a/SQLSchemaCompare.Infrastructure/DatabaseProviders/ADatabaseProvider.cs +++ b/SQLSchemaCompare.Infrastructure/DatabaseProviders/ADatabaseProvider.cs @@ -208,6 +208,7 @@ protected TDatabase DiscoverDatabase(TDatabaseContext context, TaskInfo taskInfo index.Database = db; index.ColumnNames.AddRange(indexGroup.Where(x => !x.IsIncluded).OrderBy(x => x.OrdinalPosition).Select(x => x.ColumnName)); index.ColumnDescending.AddRange(indexGroup.Where(x => !x.IsIncluded).OrderBy(x => x.OrdinalPosition).Select(x => x.IsDescending)); + index.ColumnPrefixLengths.AddRange(indexGroup.Where(x => !x.IsIncluded).OrderBy(x => x.OrdinalPosition).Select(x => x.PrefixLength)); index.IncludedColumns.AddRange(indexGroup.Where(x => x.IsIncluded).OrderBy(x => x.OrdinalPosition).Select(x => x.ColumnName)); db.Indexes.Add(index); } diff --git a/SQLSchemaCompare.Infrastructure/DatabaseProviders/MySqlDatabaseProvider.cs b/SQLSchemaCompare.Infrastructure/DatabaseProviders/MySqlDatabaseProvider.cs index e56c94f..e2449bb 100644 --- a/SQLSchemaCompare.Infrastructure/DatabaseProviders/MySqlDatabaseProvider.cs +++ b/SQLSchemaCompare.Infrastructure/DatabaseProviders/MySqlDatabaseProvider.cs @@ -137,7 +137,8 @@ protected override IEnumerable GetIndexes(MySqlDatabaseContext con query.AppendLine(" CAST(s.SEQ_IN_INDEX AS SIGNED) AS 'OrdinalPosition',"); query.AppendLine(" CASE WHEN s.COLLATION = 'D' THEN TRUE ELSE FALSE END as 'IsDescending',"); query.AppendLine(" s.INDEX_TYPE AS 'IndexType',"); - query.AppendLine(" COALESCE(tc.CONSTRAINT_TYPE, 'INDEX') AS 'ConstraintType'"); + query.AppendLine(" COALESCE(tc.CONSTRAINT_TYPE, 'INDEX') AS 'ConstraintType',"); + query.AppendLine(" s.SUB_PART AS 'PrefixLength'"); query.AppendLine("FROM INFORMATION_SCHEMA.STATISTICS s"); query.AppendLine("LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc"); query.AppendLine(" ON tc.table_name = s.table_name AND tc.table_schema = s.table_schema AND tc.constraint_name = s.index_name"); diff --git a/SQLSchemaCompare.Infrastructure/SqlScripters/MySqlScripter.cs b/SQLSchemaCompare.Infrastructure/SqlScripters/MySqlScripter.cs index 29aafde..4b080a3 100644 --- a/SQLSchemaCompare.Infrastructure/SqlScripters/MySqlScripter.cs +++ b/SQLSchemaCompare.Infrastructure/SqlScripters/MySqlScripter.cs @@ -291,12 +291,19 @@ protected override string ScriptCreateIndex(ABaseDbIndex index) var scriptOrder = index.ColumnDescending.Any(x => x); var columnList = index.ColumnNames.Select((x, i) => { + var column = $"{this.ScriptHelper.ScriptObjectName(x)}"; + + if (indexMySql.IndexType == "BTREE" && index.ColumnPrefixLengths[i] != null) + { + column += $"({index.ColumnPrefixLengths[i]})"; + } + if (scriptOrder) { - return $"{this.ScriptHelper.ScriptObjectName(x)} {(index.ColumnDescending[i] ? "DESC" : "ASC")}"; + column += $" {(index.ColumnDescending[i] ? "DESC" : "ASC")}"; } - return $"{this.ScriptHelper.ScriptObjectName(x)}"; + return column; }); sb.Append("CREATE "); diff --git a/SQLSchemaCompare.Test/Datasources/sakila-schema-mariadb.sql b/SQLSchemaCompare.Test/Datasources/sakila-schema-mariadb.sql index b10677f..8837e00 100644 --- a/SQLSchemaCompare.Test/Datasources/sakila-schema-mariadb.sql +++ b/SQLSchemaCompare.Test/Datasources/sakila-schema-mariadb.sql @@ -25,6 +25,7 @@ CREATE TABLE actor ( last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted BIT(1) NOT NULL DEFAULT b'0', PRIMARY KEY (actor_id), + KEY idx_actor_name (first_name(10), last_name(15)), KEY idx_actor_last_name (last_name) )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/SQLSchemaCompare.Test/Datasources/sakila-schema-mysql.sql b/SQLSchemaCompare.Test/Datasources/sakila-schema-mysql.sql index 0e5d8cc..553f128 100644 --- a/SQLSchemaCompare.Test/Datasources/sakila-schema-mysql.sql +++ b/SQLSchemaCompare.Test/Datasources/sakila-schema-mysql.sql @@ -23,7 +23,9 @@ CREATE TABLE actor ( first_name VARCHAR(45) NOT NULL, last_name VARCHAR(45) NOT NULL, last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted BIT(1) NOT NULL DEFAULT b'0', PRIMARY KEY (actor_id), + KEY idx_actor_name (first_name(10), last_name(15)), KEY idx_actor_last_name (last_name) )ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;