改变数据表
在建立或倒入一个数据表之后用户可能需要修改表的设计这时就可以使用ALTER TABLE语句但是注意改变现存的表的结构可能会导致用户丢失一些数据比如改变一个域的数据类型将导致数据丢失或捨入错误这取决于用户现在使用的数据类型改变数据表也可能会破坏用户的应用程序中涉及到所改变的域的部分所以用户在修改现有表的结构之前一定要格外小心
使用ALTER TABLE 语句用户可以增加删除或改变列或域也可以增加或删除一个约束还可以为某个域设定缺省值但是一次只能修改一个域假设我们有一个记账单的数据库而我们想在顾客数据表中增加一个域这时可以使用ALTER TABLE 语句在其ADD COLUMN 子句后写上域的名称数据类型和数据的大小(如果需要的话)
ALTER TABLE tblCustomers
ADD COLUMN Address TEXT()
要改变域的数据类型或大小可以使用ALTER COLUMN子句在后面加上期望的数据类型和数据的大小
ALTER TABLE tblCustomers
ALTER COLUMN Address TEXT()
如果需要改变域的名称则必须删除该域并重新创建删除一个域要使用DROP COLUMN 子句在其后跟上域的名称
ALTER TABLE tblCustomers
DROP COLUMN Address
注意使用这种方法将会删除该域的现存数据如果需要保存这些数据则用户需要在Access的用户界面的设计模式中改变该域的名称或者编写代码将现存的数据保存在一个临时的表中然后将其添加到改名后的表中
缺省值是指在表中增加新纪录并且没有为该列赋值时自动填充到该域中的值为某域设置缺省值要在定义域的类型后使用使用DEFAULT关键字不管是使用ADD COLUMN或 ALTER COLUMN 子句
ALTER TABLE tblCustomers
ALTER COLUMN Address TEXT() DEFAULT Unknown
注意缺省值并不使用单引号包含如果用了单引号则引号也会插入到记录中在CREATE TABLE语句中也可以使用DEFAULT关键字
CREATE TABLE tblCustomers (
CustomerID INTEGER CONSTRAINT PK_tblCustomers
PRIMARY KEY
[Last Name] TEXT() NOT NULL
[First Name] TEXT() NOT NULL
Phone TEXT()
Email TEXT()
Address TEXT() DEFAULT Unknown)
注意 DEFAULT 语句只有在Jet OLE DB provider和ADO中可以执行在Access SQL View的用户界面中使用将会返回错误信息
下面的部分将讨论如何在ALTER TABLE语句中使用约束要获得更详细的有关ALTER TABLE的说明请在Office 助手中或在Microsoft Access 帮助的回答向导的标签页中输入ALTER TABLE 然后单击查找
约束
在《Access 的基础Microsoft Jet SQL》一文中我们讨论了建立表之间的联系的约束方法约束也能用于建立主键和参考完整性来限制插入到一个域中的数据值通常约束可以用于保持用户数据库中的数据完整性和一致性
共有两种类型的约束单数据域(或称域级的)的约束和多数据域(或称表级的)的约束两种约束都可以用在CREATE TABLE 或 ALTER TABLE 语句中
单域的约束也就是通常所说的列级的约束是在域及其数据类型定义后针对该域定义的下面我们使用用户表在CustomerID域生成一个单域的主键增加约束时在域名后使用CONSTRAINT关键字
ALTER TABLE tblCustomers
ALTER COLUMN CustomerID INTEGER
CONSTRAINT PK_tblCustomers PRIMARY KEY
注意这里给出了约束的名称用户还可以在定义主键时使用简称而省略CONSTRAINT子句
ALTER TABLE tblCustomers
ALTER COLUMN CustomerID INTEGER PRIMARY KEY
然而使用简称的方法将导致Access随机的生成约束的名称从而使得在代码中难以引用所以最好给约束制定名称
要删除一个约束可以在ALTER TABLE 语句中使用DROP CONSTRAINT 子句并给出约束的名称
ALTER TABLE tblCustomers
DROP CONSTRAINT PK_tblCustomers
约束还可以用来给域限制允许值用户可以将限制值设为非空(NOT NULL)或唯一( UNIQUE)或者定义一个检验性的约束该约束指一种可以应用于某个域的规则比如用户希望限制姓和名的域是唯一的就意味着在表中永远不会有两个相同姓名的记录存在这是因为这种约束是多域的性的是在表的级别定义的而非域的级别使用ADD CONSTRAINT子句可以定义一个多域的列表
ALTER TABLE tblCustomers
ADD CONSTRAINT CustomerNames UNIQUE
([Last Name] [First Name])
注意 我们在这里只是示范一下如何使用约束而在实际的应用程序中用户可能并不希望彻底限制姓名的唯一性
检验性约束是一种新的强有力的SQL特性它通过一个表达式从而允许用户在表中添加数据合法性检验该表达式可以指向一个单域也可以指向跨越一个或多个表的多个域比如用户希望确定输入到发票记录中的数值是否总是大于则可以在ALTER TABLE语句的ADD CONSTRAINT子句中定义一个CHECK关键字
ALTER TABLE tblInvoices
ADD CONSTRAINT CheckAmount
CHECK (Amount > )
注意 检验性约束语句只能通过Jet OLE DB provider和ADO来执行在Access SQL View的用户界面中使用将返回错误信息而且要删除一个检验性约束也必须在Jet OLE DB provider 和ADO中执行DROP CONSTRAINT语句另外如果用户已经定义了一个检验性约束 () 在Access的用户界面中并不会显示为一个合法性规则() 用户也不能在该界面中定义合法性文本的属性否则将给出一般性错误信息() 在用户通过ADO使用DROP CONSTRAINT语句之前不能够通过Access的用户界面或者在代码中删除数据表
用来定义一个检验性约束的表达式也可以用来指向同一个表中的多个域甚至是其他表中的域其中可以使用任何在Microsoft Jet SQL 中合法的操作符比如SELECT 语句数学运算符以及集合函数等用来定义检验性约束的表达式的长度不能超过个字符
设想用户希望在将顾客加入到Customers 表之前检查每个顾客的信用额度则可以使用带有ADD COLUMN 和CONSTRAINT 子句的ALTER TABLE 语句生成一个约束该约束将查找在CreditLimit表中的值来验证顾客的信用额度下面的SQL语句将生成一个tblCreditLimit 表然后将CustomerLimit域加入到tblCustomers 表中并将检验性约束加到tblCustomers表最后对该检验性约束进行测试
CREATE TABLE tblCreditLimit (
Limit DOUBLE)
INSERT INTO tblCreditLimit
VALUES ()
ALTER TABLE tblCustomers
ADD COLUMN CustomerLimit DOUBLE
ALTER TABLE tblCustomers
ADD CONSTRAINT LimitRule
CHECK (CustomerLimit <= (SELECT Limit
FROM tblCreditLimit))
UPDATE TABLE tblCustomers
SET CustomerLimit =
WHERE CustomerID =
注意当用户执行UPDATE TABLE语句时将被提示更新失败因为该语句违反了检验性约束如果用户使用小于等于的值来更新CustomerLimit域就能够成功
约束II
级联性更新和删除
约束还可以用来在数据库中的表间建立参考完整性具有参考完整性意味着数据是一致的和未被破坏的比如如果删除了一个顾客的记录但是该顾客的运单记录仍旧存在数据库中这时数据就是非一致的即指数据库中存在着一个孤立的顾客运单记录参考完整性是在用户建立各个表间的关系时建立的除了建立参考完整性之外用户还可以使用级联性更新和删除来确保相互参考的表保持同步例如一旦定义了级联性更新和删除当用户删除顾客记录时该顾客的运单记录也将自动删除
要使用级联性更新和删除用户可以在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
注意: 快速外键语句只能通过Jet OLE DB provider 和 ADO来执行在Access SQL View的用户界面中使用将返回错误信息而且要删除一个快速外键也必须在Jet OLE DB provider 和ADO中执行DROP CONSTRAINT语句
在记录按序排列的数据库应用中快速外键也将发挥作用