在列上放置约束(索引)


12

如何修改具有索引的表的类型?我试图在一个空表上做一个alter列,以将类型从日期时间修改为varchar(15),并收到错误消息说它对列有依赖性(原来是索引)。

通过右键单击索引并编写脚本脚本,可以轻松地在本地解决此问题,但需要在无法访问索引名称的其他服务器上进行扩展。

有没有办法使脚本删除所有索引,让我在列上更改数据类型,然后读取索引?谢谢!

Answers:


7

您可以使用sys.indexes视图获取索引。您可以将此表连接到sys.tables,sys.columns和sys.index_column以获得创建动态删除索引的信息。您可以使用此简单选择来生成您的放置索引。您可以使用where子句来过滤表和列。如果要更改Table1.Column1,则必须使用这些名称来过滤select以获取正确的delete语句

use [testdb]
go
declare @sqlDropIndex NVARCHAR(1000)

select @sqlDropIndex = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
from sys.indexes idx inner join 
        sys.tables tbl on idx.object_id = tbl.object_id inner join
        sys.index_columns idxCol on idx.index_id = idxCol.index_id inner join
        sys.columns col on idxCol.column_id = col.column_id
where idx.type <> 0 and
        tbl.name = 'MyTableName' and
        col.name = 'MyColumnName'
group by idx.name, tbl.name
order by idx.name desc

print @sqlDropIndex
--exec sp_executeSql @sqlDropIndex
go

希望对你有帮助


3
加入时,必须使用idx.object_id = idxCol.object_id和idxCol.object_id = col.object_id丰富连接语句,并且无需分组。
Bax

2

为了更改任何列,首先必须删除索引或包含该列的任何其他约束,然后再次创建索引/约束。但是此任务必须由DBA完成,因为索引或约束的任何下降都会一方面影响正在查询的数据-在删除索引的同时,另一方面,在重新建立索引时会阻塞整个表。创建。您需要确保用户将了解此维护的大小(取决于表的大小)。祝好运!

但是,可以使用较少阻塞的“联机”选项来完成索引创建。


0

如果先删除索引,除非重新创建索引,否则将无法再次读取它。您可以执行哪些操作来禁用约束的实施。

ALTER TABLE name_of_the_table NOCHECK CONSTRAINT name_of_the_constraint;

运行此脚本后,将不会强制执行约束,并且您可以输入数据而不必担心约束检查。您可以再次更改该表以重新启用约束。

ALTER TABLE name_of_the_table CHECK CONSTRAINT name_of_the_constraint;

不会检查或更正以前的任何违例,但是将强制执行约束后的所有条目。


-2

Niko的答案有2个错误(缺少2个object_id条件)。无需group by

SELECT  @sql = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
FROM    sys.indexes             idx 
INNER JOIN sys.tables           tbl     ON idx.object_id = tbl.object_id 
INNER JOIN sys.index_columns    idxCol  ON idx.index_id = idxCol.index_id   AND idx.object_id = idxCol.object_id 
INNER JOIN sys.columns          col     ON idxCol.column_id = col.column_id AND  idxCol.object_id = col.object_id
WHERE   idx.type <> 0 
AND     tbl.name = 'file_transfer_log' 
AND     col.name = 'tender_id';

1
请参阅为什么我应该注册我的帐户?在Stack Exchange常见问题解答中。
保罗·怀特9
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.