2010-02-18 75 views
6

我想记住一些sql语法,并且已经获得了ALTER TABLE ADD CONSTRAINT语法。我相信我是正确的,当我说当你使用这个语法来添加一个FOREIGN KEY或PRIMARY KEY约束时,那个sql server会自动创建索引来支持约束操作。 (这是真的......还是仅仅在PK上而不是在FK上?)当删除约束时,支持索引是否也会被删除?

如果是这样,当你使用ALTER TABLE DROP CONSTRAINT语法时......是否支持索引自动下降?这些隐式支持索引可以被明确地删除吗?如果是的话CONSTRAINT自动删除?

我只是想知道它是如何工作“下盖”。谷歌搜索没有帮助。我想我可以查询一些sys表来发现真相,但我认为我会在这里尝试。

感谢您的帮助。

赛斯

回答

2

添加主键时,实际上添加了唯一索引。是否导致新索引被聚集取决于您是否指定它是非聚簇的。如果在添加主键约束时未指定它是聚簇还是非聚簇,那么如果聚簇约束或索引尚未存在于表上,则它将被聚簇,否则它将为非聚簇。

当您添加外键时,不会自动创建索引。

当您删除约束时,将删除作为约束创建结果而创建的任何索引。但是,如果尝试删除唯一或主键约束,并且存在引用它的外键约束,则会出现错误。

作为约束创建结果创建的索引不能使用DROP INDEX删除。

2

主键约束将添加一个聚集索引表中,如果一个尚不存在,否则唯一的非聚集索引将为其创建。

删除主键约束还会删除基础索引。

外键约束不会添加索引。

删除外键约束对索引无效。

外键与索引无关。

+0

并非总是如此。如果表上已经有聚簇索引,则PRIMARY KEY约束将由唯一的非聚簇索引强制执行。 – 2010-02-18 20:28:59

+0

在SQL Server 2008中,外键与索引有一些共同之处。我无法删除索引(并且它不是主键索引),因为如果被外键引用。 – LukLed 2010-02-18 20:32:40

+1

@LukLed,当你使用FK强制实现一对多的父子关系时,如果你试图在父对象上删除唯一性约束,父对象需要是唯一的,它会抛出一个错误。 – 2010-02-18 20:34:50

2

FKs不会自动获得SQL Server中的索引,如果你想要的话你需要添加它!当放弃FK时,您不会删除索引,您需要自行删除索引。

2

执行UNIQUE约束的索引将被删除,支持FK约束的索引不会自动删除。它也不会自动创建。

相关问题