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 | public static string GenerateRandomCode(int length) |
解决方案三:
不考虑名称的连续性,直接在最大值基础上往上加。
3. 字段有索引时,不能修改字段类型
解决方法:先删除索引,修改字段后,再新建索引。
这里会引起一个额外的问题:如何确认要修改的字段是否已存在索引。
有以下几种情况:
- 字段有索引,checkbox已勾选=>先删除索引,修改字段,再新建索引。
- 字段有索引,checkbox不勾选=>先删除索引,再修改字段
- 字段无索引,checkbox已勾选=>先修改字段,再添加索引
- 字段无索引,checkbox不勾选=>直接修改字段
还有两种情况
新增字段:先增加字段,根据checkbox值,选择是否添加索引。
删除字段:先删除索引,再删除字段
此外,若只增删索引,则会重复修改字段操作。
设定bool标识justindex,每次调用compareList()方法时,确认行有差异,是否是因为只有索引列发生变化,如是则设为true,否则有其他引起行的差异则设为false。这样,在做同步操作前,先根据bool标识,获知引起行差异的原因,可省去没必要的修改字段操作。
一共有八钟可能的操作
- 只增加字段,不增加索引 OK
- 只修改字段,不增加索引 OK
- 不修改字段,增加索引 OK
- 不修改字段,删除索引 OK
- 既增加字段,又增加索引 OK
- 既修改字段,又增加索引 OK
- 既修改字段,又删除索引 OK
- 既删除字段,又删除索引 OK