![]() ![]() |
|
MSJetSQLforAccess2000中级篇(II) | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/6/19 14:51:51 文章录入:杜斌 责任编辑:杜斌 | |
|
|
改变数据表 使用ALTER TABLE 语句,用户可以增加,删除或改变列或域,也可以增加或删除一个约束。还可以为某个域设定缺省值,但是一次只能修改一个域。假设我们有一个记账单的数据库,而我们想在顾客数据表中增加一个域,这时可以使用ALTER TABLE 语句,在其ADD COLUMN 子句后写上域的名称、数据类型和数据的大小(如果需要的话)。 ALTER TABLE tblCustomers ALTER TABLE tblCustomers ALTER TABLE tblCustomers 缺省值是指在表中增加新纪录并且没有为该列赋值时自动填充到该域中的值。为某域设置缺省值,要在定义域的类型后使用使用DEFAULT关键字,不管是使用ADD COLUMN或 ALTER COLUMN 子句。 ALTER TABLE tblCustomers CREATE TABLE tblCustomers ( 注意: DEFAULT 语句只有在Jet OLE DB provider和ADO中可以执行,在access SQL View的用户界面中使用将会返回错误信息。 下面的部分将讨论如何在ALTER TABLE语句中使用约束。要获得更详细的有关ALTER TABLE的说明,请在Office 助手中或在Microsoft access 帮助的回答向导的标签页中输入ALTER TABLE ,然后单击查找。 约束 共有两种类型的约束:单数据域(或称域级的)的约束和多数据域(或称表级的)的约束。两种约束都可以用在CREATE TABLE 或 ALTER TABLE 语句中。 单域的约束,也就是通常所说的列级的约束,是在域及其数据类型定义后针对该域定义的。下面我们使用用户表,在CustomerID域生成一个单域的主键。增加约束时,在域名后使用CONSTRAINT关键字。 ALTER TABLE tblCustomers 注意这里给出了约束的名称。用户还可以在定义主键时使用简称而省略CONSTRAINT子句。 ALTER TABLE tblCustomers 然而,使用简称的方法将导致access随机的生成约束的名称,从而使得在代码中难以引用。所以,最好给约束制定名称。 要删除一个约束,可以在ALTER TABLE 语句中使用DROP CONSTRAINT 子句,并给出约束的名称。 ALTER TABLE tblCustomers 约束还可以用来给域限制允许值。用户可以将限制值设为非空(NOT NULL)或唯一( UNIQUE),或者定义一个检验性的约束,该约束指一种可以应用于某个域的规则。比如用户希望限制姓和名的域是唯一的,就意味着在表中永远不会有两个相同姓名的记录存在。这是因为这种约束是多域的性的,是在表的级别定义的,而非域的级别。使用ADD CONSTRAINT子句可以定义一个多域的列表。 ALTER TABLE tblCustomers 注意: 我们在这里只是示范一下如何使用约束,而在实际的应用程序中,用户可能并不希望彻底限制姓名的唯一性。 检验性约束是一种新的强有力的SQL特性,它通过一个表达式从而允许用户在表中添加数据合法性检验,该表达式可以指向一个单域,也可以指向跨越一个或多个表的多个域。比如用户希望确定输入到发票记录中的数值是否总是大于0,则可以在ALTER TABLE语句的ADD CONSTRAINT子句中定义一个CHECK关键字。 ALTER TABLE tblInvoices 注意: 检验性约束语句只能通过Jet OLE DB provider和ADO来执行,在Access SQL View的用户界面中使用将返回错误信息。而且,要删除一个检验性约束,也必须在Jet OLE DB provider 和ADO中执行DROP CONSTRAINT语句。另外,如果用户已经定义了一个检验性约束: (1) 在Access的用户界面中并不会显示为一个合法性规则,(2) 用户也不能在该界面中定义合法性文本的属性,否则将给出一般性错误信息,(3) 在用户通过ADO使用DROP CONSTRAINT语句之前,不能够通过access的用户界面或者在代码中删除数据表。 用来定义一个检验性约束的表达式也可以用来指向同一个表中的多个域,甚至是其他表中的域。其中可以使用任何在Microsoft Jet SQL 中合法的操作符,比如SELECT 语句、数学运算符、以及集合函数等。用来定义检验性约束的表达式的长度不能超过64个字符。 设想用户希望在将顾客加入到Customers 表之前检查每个顾客的信用额度。则可以使用带有ADD COLUMN 和CONSTRAINT 子句的ALTER TABLE 语句生成一个约束,该约束将查找在CreditLimit表中的值来验证顾客的信用额度。下面的SQL语句将生成一个tblCreditLimit 表,然后将CustomerLimit域加入到tblCustomers 表中,并将检验性约束加到tblCustomers表,最后对该检验性约束进行测试。 CREATE TABLE tblCreditLimit ( 注意:当用户执行UPDATE TABLE语句时,将被提示更新失败,因为该语句违反了检验性约束。如果用户使用小于等于100的值来更新CustomerLimit域,就能够成功。 约束-II 级联性更新和删除 约束还可以用来在数据库中的表间建立参考完整性。具有参考完整性意味着数据是一致的和未被破坏的。比如,如果删除了一个顾客的记录但是该顾客的运单记录仍旧存在数据库中,这时数据就是非一致的,即指数据库中存在着一个孤立的顾客运单记录。参考完整性是在用户建立各个表间的关系时建立的。除了建立参考完整性之外,用户还可以使用级联性更新和删除来确保相互参考的表保持同步。例如,一旦定义了级联性更新和删除,当用户删除顾客记录时,该顾客的运单记录也将自动删除。 要使用级联性更新和删除,用户可以在ALTER TABLE 语句的CONSTRAINT子句中使用ON UPDATE CASCADE 和/或 ON DELETE CASCADE 关键字。注意他们都必须是应用于外键的。 ALTER TABLE tblShipping 外键 ALTER TABLE tblInvoices 注意: 快速外键语句只能通过Jet OLE DB provider 和 ADO来执行。在access SQL View的用户界面中使用将返回错误信息。而且,要删除一个快速外键,也必须在Jet OLE DB provider 和ADO中执行DROP CONSTRAINT语句。 在记录按序排列的数据库应用中,快速外键也将发挥作用。比如这里有一个用来辨别所跟踪的顾客类型的 CustomerTypes的表,一个Customer 表和一个Orders 表。在CustomerTypes表中有10行,在 Customer 表中有100000行,在Orders表中有350000行。这时采用在Customers 表中指向CustomerTypes表中的主键的快速外键将是很好的选择,因为在100000行记录外最多只有10行唯一的记录。这时索引对于提取数据毫无用处,并且在CustomerType中插入、删除和更新数据是成为累赘。 而另一方面,快速外键应用于Orders 表中的CustomerID 列很可能是没有用处的,因为那些值每一个都代表了不同的客户,所以一般是唯一的。在这种情况下,使用通常的带有索引的外键将会很有裨益,这是因为它是应用在连结和其他查找规则上的。 注意: 尽管在本节的大部分例子中使用的是ALTER TABLE语句,但是所有这些都是可以写在CREATE TABLE 语句中的。 要了解有关CONSTRAINT子句的更多信息,请在Office 助手中或在Microsoft access 帮助的回答向导的标签页中输入ALTER TABLE ,然后单击查找。 数据类型 文本(TEXT)数据类型 总的来说,文本域最多可以有255个字符,而备注域则最多可以有65,535 个字符,但是如果备注域不包含任何二进制数据的话,其唯一的限制就是整个数据库的最大容量(大概是2.14GB 或 1,070,000,000 双字节字符)。另外,没有用到的文本与部分并不会保存在内存中。 下面的表格列示了最基本的Jet 文本数据类型,它的同义字以及所分配的字节数。 Jet 数据类型 TEXT(文本) MEMO(备注) 下面的CREATE TABLE语句示范了可以用来通过access SQL View用户界面创建表的TEXT 和MEMO的不同形式的同义词。 CREATE TABLE tblUITextDataTypes ( 如果用户通过access的用户界面察看上面的tblUITextDataTypes表的设计的话,将会看到MEMO、 LONGTEXT、 LONGCHAR、和注意同义字都是MEMO 的数据类型,其他的所有同义字都是TEXT数据类型。对于那些没有定义长度的TEXT 数据类型,缺省的长度为255个字符。 虽说上面的SQL语句也可以通过Jet OLE DB provider和 ADO来执行,但还是有一些其他的TEXT 和MEMO 数据类型的不同定义只能通过Jet OLE DB provider 和ADO来执行。 CREATE TABLE tblCodeTextDataTypes 如果用户通过access的用户界面察看上面的tblUITextDataTypes表的设计的话,将会看到只有NCHAR数据类型是MEMO,其他的都是TEXT数据类型。对于那些没有定义长度的TEXT 数据类型,缺省的长度为255个字符。 注意: 在上面的SQL语句中列示的这些数据类型只能通过Jet OLE DB provider 和ADO来执行,在Access SQL View的用户界面中使用将导致错误信息。还要注意如果通过Jet OLE DB provider和 ADO创建了一个TEXT数据类型的域,则通过access用户界面看到的将是MEMO的数据类型。 Unicode压缩 现在在Microsoft Jet 4.0 数据引擎中,所有的TEXT数据类型都是以两个字节的统一编码形式存储的。它取代了前面版本中采用的多字节字符集(Multi-byte Character Set ,MBCS)格式。虽然双字节的格式需要更多的空间来存储每个字符,但可以定义使用TEXT数据类型的自动进行压缩。 在用户使用SQL建立的TEXT的数据类型时,双字节编码的压缩属性缺省设置为NO,如果需要将该属性设置为Yes,用户可以在定义域的时候使用WITHCOMPRESSION (或者 WITH COMP)关键字。 下面的CREATE TABLE 语句将创建一个新的顾客表,这里将双字节编码的压缩属性设置为Yes。 CREATE TABLE tblCompressedCustomers ( 注意WITH COMPRESSION 和WITH COMP关键字要在NOT NULL之前定义。用户也可以使用ALTER TABLE语句改变现存域的双字节编码的压缩属性,如下所示: ALTER TABLE tblCustomers 注意: 在上面的SQL语句中列示的WITH COMPRESSION and WITH COMP关键字只能通过Jet OLE DB provider 和ADO来执行,在access SQL View的用户界面中使用将导致错误信息。 在用户设计数据表时采取那种数据类型取决于用户的应用程序的目的。如果该应用程序总是应用在Jet数据库的基础上,则应该使用最适宜的那些数据类型。但如果该应用程序最终要用到ODBC-compliant的数据库上,比如SQL Server 或 MSDE,则要使用那些是一致最方便的数据类型。 数字( NUMERIC)数据类型 下面的表格列示了基本的Jet NUMERIC数据类型,它的各种同义字以及为期分配的字节数。 Jet 数据类型 TINYINT SMALLINT INTEGER REAL FLOAT DECIMAL 下面的CREATE TABLE 语句示范了各种可以在通过access SQL View 的用户界面创建表时使用的SNUMERIC 数据类型。 CREATE TABLE tblUINumericDataTypes ( 虽然上面的SQL 语句也可以通过Jet OLE DB provider 和ADO来执行,仍有一些其他的NUMERIC 数据类型的形式只能通过Jet OLE DB provider 和 ADO来执行。 CREATE TABLE tblCodeNumericDataTypes ( 注意: 上面的SQL 语句中的数据类型只能通过Jet OLE DB provider 和 ADO来执行,在Access SQL View的用户界面中使用将导致错误信息。还要注意如果通过Access SQL View 建立了一个NUMERIC 数据类型的域,通过Access 用户界面察看表的设计时看到的将是DOUBLE 数据类型,但是如果通过Jet OLE DB provider 和 ADO建立NUMERIC数据类型,通过access 用户界面看到的将是DECIMAL数据类型. 使用新的DECIMAL 数据类型,用户可以设定数值的精度和小数位。精度就是该域所能包含的数字的总数,而小数位则决定了小数点右面能有几位数字,精度缺省值是18,最大的允许值28,而小数位缺省的是0,最大值时28。 CREATE TABLE tblDecimalDataTypes ( 货币(CURRENCY)数据类型 下面的CREATE TABLE 语句示范了CURRENCY 数据类型在创建数据表时的用法,它既可以在access SQL View 用户界面中也可以在Jet OLE DB provider 和 ADO中使用。 CREATE TABLE tblCurrencyDataTypes ( 是否(BOOLEAN )数据类型 是否(BOOLEAN)是逻辑数据类型,其值为是(TRUE)或否(FALSE)。它们使用一个字节的存储量,同义字有BIT、 LOGICAL、 LOGICAL1 和 YESNO。 True的值等于–1, False的值等于0。 下面的CREATE TABLE 语句示范了通过Jet OLE DB provider 和 ADO 来创建BOOLEAN 数据类型的不同形式。 CREATE TABLE tblUIBooleandataTypes ( 字节(BINARY )数据类型 字节(BINARY )数据类型以二进制的本来面目存储小容量的任何类型的数据。它对于所存储的每个字符只使用1个字节的存储量,用户可以指定所分配的字节数。如果没有制定字节数,缺省的值是510,这也是所能允许的最大字节数。它的同义字有BINARY、 VARBINARY和 BINARY VARYING。BINARY 数据类型在access 用户界面中是不可用的。 下面的 CREATE TABLE 语句示范了可以用来在access SQL View 用户界面中使用的BINARY 数据类型的不同形式。 CREATE TABLE tblUIBinaryDataTypes ( 虽然上面的SQL语句也可以通过Jet OLE DB provider 和 ADO执行,但仍然有些其他的binary 数据类型的同义字只能通过Jet OLE DB provider 和 ADO来执行,如下所示: CREATE TABLE tblCodeBinaryDataTypes ( OLEOBJECT 数据类型 下面的 CREATE TABLE 语句展示了通过access SQL View 用户界面或Jet OLE DB provider和ADO 来创建表时使用OLEOBJECT 数据类型。 CREATE TABLE tblImageDataTypes ( 日期时间(DATETIME)数据类型 日期时间(DATETIME)数据类型用来存储日期、时间以及日期和时间的结合值,年数可以从100到 9999。它使用8个字节的存储量,其同义字有DATE、TIME、DATETIME和 TIMESTAMP 下面的 CREATE TABLE 语句展示了通过access SQL View 用户界面或Jet OLE DB provider 和 ADO 创建表示所使用的DATETIME 数据类型的不同形式。 CREATE TABLE tblDateTimeDataTypes ( COUNTER 数据类型 COUNTER 数据类型用来存储长整型数值,该数值在表中每增加一条新的纪录时能够自动增加。使用COUNTER 数据类型,用户可以设定一个种子值和增加值,种子值是当第一个记录插入到表中时将输入到域中的数值,而增加值用来加到上一个记数值上作为下一个记数值。如果没有指定种子值和增加值,它们都将缺省的使用1。在一个表中只能有一个COUNTER域。其同义字有 COUNTER、AUTOINCREMENT和IDENTITY。 下面的 CREATE TABLE 语句展示了通过access SQL View 用户界面创建表时使用的COUNTER 数据类型的同义字。 CREATE TABLE tblUICounterDataTypes ( 注意这里没有指定种子值和增加值,所有都将采用缺省值1。定义COUNTER 数据类型的另一种方式是使用AUTOINCREMENT 关键字,如下所示: CREATE TABLE tblUICounterDataTypes ( 这一次种子值和增加值都指定了,则开始值时10,每次将加5。上面的SQL 语句也可以通过Jet OLE DB provider 和 ADO执行,另外还有counter 数据类型的另一种形式,只能通过Jet OLE DB provider 和 ADO来执行,即IDENTITY 关键字,它和SQL Server的 IDENTITY 数据类型是相兼容的。 CREATE TABLE tblCodeCounterDataTypes 这里的种子值和增加值都可以通过ALTER TABLE 语句进行修改,修改后所有新插入的行将使用新的值。但是, COUNTER 数据类型常常都是用于主键的,而主键要求每列唯一。如果你改变了种子值, 将可能导致主键域的重复值,从而发生错误。 ALTER TABLE tblUICounterDataTypes 在以前版本的Jet数据库中,压缩数据库之后,种子值将被置为可能的最大值。在Jet 4.0中仍然如此,只要种子值和增加值的采用的是缺省值1的话。如果用户指定了不等于缺省值的种子值和增加值,在压缩数据库是并不会重置种子值。 @@IDENTITY 变量 @@IDENTITY 变量是一个全局的SQL变量,用户可以用它来提取使用COUNTER数据类型的列的最后使用值。用户在提取@@IDENTITY 变量时,不能指定表的名称。返回值总是最近的通过代码插入了数据的表的COUNTER域。 SELECT @@IDENTITY SELECT [@@IDENTITY] + 1 要获得更详细的有关数据类型的说明,请在Office 助手中或在Microsoft access 帮助的回答向导的标签页中输入ALTER TABLE ,然后单击查找。 |
|
![]() ![]() |