|
★☆☆☆☆☆☆☆☆☆ |
积分:285 |
发帖:317 |
登录:2024/3/26 |
注册:2006/6/28 |
|
(1楼)数据库索引的建立和删除
索引操作的一点小总结。
1.建表时一块建立
Create Table Phistory (MtrID Text(10) Constraint mMtrID Primary Key Default "", ......?
MtrID被建为主键,当然也有了非重复的索引. Primary Key?可以换为?Foreign Key 、Unique ,嘿嘿,含义自己琢磨。用Constraint建立的索引当然是非重复的。如果建立可重复的索引呢? Next
2.建完表后,修改字段为索引
Create Index? ix_MtrID On PHistory(MtrID)
在MtrID上就建立了可重复的索引 ix_MtrID,如果建完表后,要建立非重复的索引加个关键字Unique
Create Unique Index ix_MtrID On PHistory(MtrID)
还有别的方法么? Next
3.建完表后,修改字段为索引 Alter Table
Alter Table PHistory Add Constraint ix_MtrID Unique(MtrID,PurchaseDate)
Alter Table PHistory Alter Column MtrID Text(40) Constraint ix_MtrID Unique
用了Constraint关键字建的索引必然是非重复的,Unique可以换为 Primary Key 、Foreign Key,第一句话是一个多域的约束,第二句话同时修改了字段的数据类型。如果要删除一个索引呢 ?? Next
4.删除一个索引或者约束
Drop Index ix_MtrID On Phistory
Alter Table PHistory Drop Constraint ix_MtrID
第一句话与2对应的,第二句话与3对应的。
5.给一个字段添加一个约束
Alter Talbe PHistory Add Constraint CheckID Check(MtrID<>"1978040500")
MtrID内容必须不为"1978040500",否则会报错。
举个例子:
设想用户希望在将顾客加入到Customers 表之前检查每个顾客的信用额度。则可以使用带有ADD COLUMN 和CONSTRAINT 子句的ALTER TABLE 语句生成一个约束,该约束将查找在CreditLimit表中的值来验证顾客的信用额度。下面的SQL语句将生成一个tblCreditLimit 表,然后将CustomerLimit域加入到tblCustomers 表中,并将检验性约束加到tblCustomers表,最后对该检验性约束进行测试。
CREATE TABLE tblCreditLimit (Limit DOUBLE)
INSERT INTO tblCreditLimit VALUES (100)
ALTER TABLE tblCustomers ADD COLUMN CustomerLimit DOUBLE
ALTER TABLE tblCustomers ADD CONSTRAINT LimitRule
CHECK (CustomerLimit <= (SELECT Limit FROM tblCreditLimit))
UPDATE TABLE tblCustomers SET CustomerLimit = 200 WHERE CustomerID = 1
注意:当用户执行UPDATE TABLE语句时,将被提示更新失败,因为该语句违反了检验性约束。如果用户使用小于等于100的值来更新CustomerLimit域,就能够成功。
6.约束-级联性更新和删除
约束还可以用来在数据库中的表间建立参考完整性。具有参考完整性意味着数据是一致的和未被破坏的。比如,如果删除了一个顾客的记录但是该顾客的运单记录仍旧存在数据库中,这时数据就是非一致的,即指数据库中存在着一个孤立的顾客运单记录。参考完整性是在用户建立各个表间的关系时建立的。除了建立参考完整性之外,用户还可以使用级联性更新和删除来确保相互参考的表保持同步。例如,一旦定义了级联性更新和删除,当用户删除顾客记录时,该顾客的运单记录也将自动删除。?要使用级联性更新和删除,用户可以在ALTER TABLE 语句的CONSTRAINT子句中使用ON UPDATE CASCADE 和/或 ON DELETE CASCADE 关键字。注意他们都必须是应用于外键的。
ALTER TABLE tblShipping
ADD CONSTRAINT FK_tblShipping
FOREIGN KEY (CustomerID) REFERENCES
tblCustomers (CustomerID)
ON UPDATE CASCADE
ON DELETE CASCADE
外键
在处理外键时,有关快速外键(fast foreign key)的概念是很有用的。快速外键即是一种没有索引的外键。尽管这乍听起来有点不合理,但却可以得到很好的解释。在缺省情况下,一旦定义了一个外键,将会自动生成一个基于该外键中列的索引,这在很多情况下提高了执行保持参考完整性的操作的表现。然而,如果在定义外键的域中存在许多重复值,外键索引将会影响增加和删除数据使得效率。要防止基于外键的索引的生成,我们可以在定义外键是NO INDEX关键字。
ALTER TABLE tblInvoices
ADD CONSTRAINT FK_tblInvoices
FOREIGN KEY NO INDEX (CustomerID) REFERENCES
tblCustomers (CustomerID)
ON UPDATE CASCADE
ON DELETE CASCADE
|