C#数据库工具开发(十一)

问题(07/26-07/27)

1. 删除数据库中的一列,会自动删除与其关联的索引吗?

MySQL是这样的,详情

SQLServer经实践发现,必须先删除索引再删除列。因为索引依赖于列。

2. 索引命名引起的异常

问题背景:在新增索引时总是按照表名_INDEX_数字来给索引命名,数字是从0开始往上递增。问题在于,假设我们在test表中分别给三个字段添加了三个索引,即生成索引TEST_INDEX_0/1/2,那么如果我们删除了第一个索引TEST_INDEX_0,保留了索引TEST_INDEX_1/2,再次新建索引时,这个索引名字应该是0还是3结尾?而且我目前的实现,未考虑上述情况,只是在建立索引前查询表中索引数目,以这个数目作为新索引的结尾名,因此现在若创建一个新的索引会命名为TEST_INDEX_2,与表中已存在的索引冲突,发生异常。

解决方案一:

每次删除一个索引,把它编号之后的索引编号减一,这涉及到索引的查找和修改。

sp_rename 'tabName.old_indName','new_indName','INDEX'

解决方案二:

换一种命名方式:编号可用随机值

生成真随机数的方法:

1
2
3
4
5
6
7
8
9
10
public static string GenerateRandomCode(int length)
{
var result = new System.Text.StringBuilder();
for (var i = 0; i < length; i++)
{
var r = new Random(Guid.NewGuid().GetHashCode());
result.Append(r.Next(0, 10));
}
return result.ToString();
}

解决方案三:

不考虑名称的连续性,直接在最大值基础上往上加。

3. 字段有索引时,不能修改字段类型

解决方法:先删除索引,修改字段后,再新建索引。

这里会引起一个额外的问题:如何确认要修改的字段是否已存在索引。

有以下几种情况:

  1. 字段有索引,checkbox已勾选=>先删除索引,修改字段,再新建索引。
  2. 字段有索引,checkbox不勾选=>先删除索引,再修改字段
  3. 字段无索引,checkbox已勾选=>先修改字段,再添加索引
  4. 字段无索引,checkbox不勾选=>直接修改字段

还有两种情况

新增字段:先增加字段,根据checkbox值,选择是否添加索引。

删除字段:先删除索引,再删除字段

此外,若只增删索引,则会重复修改字段操作。

设定bool标识justindex,每次调用compareList()方法时,确认行有差异,是否是因为只有索引列发生变化,如是则设为true,否则有其他引起行的差异则设为false。这样,在做同步操作前,先根据bool标识,获知引起行差异的原因,可省去没必要的修改字段操作。

一共有八钟可能的操作

  1. 只增加字段,不增加索引 OK
  2. 只修改字段,不增加索引 OK
  3. 不修改字段,增加索引 OK
  4. 不修改字段,删除索引 OK
  5. 既增加字段,又增加索引 OK
  6. 既修改字段,又增加索引 OK
  7. 既修改字段,又删除索引 OK
  8. 既删除字段,又删除索引 OK