Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2258847
  • 博文数量: 292
  • 博客积分: 10016
  • 博客等级: 中将
  • 技术积分: 3381
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-06 11:26
文章分类

全部博文(292)

文章存档

2011年(1)

2010年(4)

2009年(3)

2008年(6)

2007年(47)

2006年(63)

2005年(168)

分类: LINUX

2005-12-14 22:29:50

改变数据表
在建立或倒入一个数据表之后,用户可能需要修改表的设计。这时就可以使用ALTER TABLE语句。

但是注意,改变现存的表的结构可能会导致用户丢失一些数据。比如,改变一个域的数据类型将导致数据丢失或舍入错误,这取决于用户现在使用的数据类型。改变数据表也可能会破坏用户的应用程序中涉及到所改变的域的部分。所以用户在修改现有表的结构之前一定要格外小心。

使用ALTER TABLE 语句,用户可以增加,删除或改变列或域,也可以增加或删除一个约束。还可以为某个域设定缺省值,但是一次只能修改一个域。假设我们有一个记账单的数据库,而我们想在顾客数据表中增加一个域,这时可以使用ALTER TABLE 语句,在其ADD COLUMN 子句后写上域的名称、数据类型和数据的大小(如果需要的话)。

ALTER TABLE tblCustomers
ADD COLUMN Address TEXT(30)
要改变域的数据类型或大小,可以使用ALTER COLUMN子句,在后面加上期望的数据类型和数据的大小。

ALTER TABLE tblCustomers
ALTER COLUMN Address TEXT(40)
如果需要改变域的名称,则必须删除该域并重新创建。删除一个域要使用DROP COLUMN 子句,在其后跟上域的名称。

ALTER TABLE tblCustomers
DROP COLUMN Address
注意使用这种方法将会删除该域的现存数据。如果需要保存这些数据,则用户需要在Access的用户界面的设计模式中改变该域的名称,或者编写代码将现存的数据保存在一个临时的表中然后将其添加到改名后的表中。

缺省值是指在表中增加新纪录并且没有为该列赋值时自动填充到该域中的值。为某域设置缺省值,要在定义域的类型后使用使用DEFAULT关键字,不管是使用ADD COLUMN或 ALTER COLUMN 子句。

ALTER TABLE tblCustomers
ALTER COLUMN Address TEXT(40) DEFAULT Unknown
注意缺省值并不使用单引号包含,如果用了单引号,则引号也会插入到记录中。在CREATE TABLE语句中也可以使用DEFAULT关键字。

CREATE TABLE tblCustomers (
CustomerID INTEGER CONSTRAINT PK_tblCustomers
PRIMARY KEY,
[Last Name] TEXT(50) NOT NULL,
[First Name] TEXT(50) NOT NULL,
Phone TEXT(10),
Email TEXT(50),
Address TEXT(40) DEFAULT Unknown)


注意: DEFAULT 语句只有在Jet OLE DB provider和ADO中可以执行,在Access SQL View的用户界面中使用将会返回错误信息。

下面的部分将讨论如何在ALTER TABLE语句中使用约束。要获得更详细的有关ALTER TABLE的说明,请在Office 助手中或在Microsoft Access 帮助的回答向导的标签页中输入ALTER TABLE ,然后单击查找。

约束
在《Access 2000的基础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特性,它通过一个表达式从而允许用户在表中添加数据合法性检验,该表达式可以指向一个单域,也可以指向跨越一个或多个表的多个域。比如用户希望确定输入到发票记录中的数值是否总是大于0,则可以在ALTER TABLE语句的ADD CONSTRAINT子句中定义一个CHECK关键字。

ALTER TABLE tblInvoices
ADD CONSTRAINT CheckAmount
CHECK (Amount > 0)


注意: 检验性约束语句只能通过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 (
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域,就能够成功。

约束-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语句。

在记录按序排列的数据库应用中,快速外键也将发挥作用。比如这里有一个用来辨别所跟踪的顾客类型的 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 ,然后单击查找。








数据类型
在努力使基Jet数据引擎的Access应用程序易于向那些基于Microsoft SQL Server 或 MSDE的应用转化方面,Jet 数据引擎改变了一些数据类型,增加了一些新的数据类型字。下面的部分将讨论主要的数据类型及其如何实现的。

文本(TEXT)数据类型
文本(TEXT)数据类型是用来设置一个可以存储纯文本的域的,也可以用来存储同时包含文本和数字的内容,但其中的数字并不是用于计算的,比如电话号码或者电子邮件地址。当用户通过ACESS的用户界面创建表时,用户有两种基本的文本类型:文本(TEXT)和备注(MEMO)。但是通过SQL语句如CREATE TABLE或者 ALTER TABLE 来创建表时,则还有其他许多的TEXT 和 MEMO类型的同义字可供选择。

总的来说,文本域最多可以有255个字符,而备注域则最多可以有65,535 个字符,但是如果备注域不包含任何二进制数据的话,其唯一的限制就是整个数据库的最大容量(大概是2.14GB 或 1,070,000,000 双字节字符)。另外,没有用到的文本与部分并不会保存在内存中。

下面的表格列示了最基本的Jet 文本数据类型,它的同义字以及所分配的字节数。

Jet 数据类型
同义字
存储容量

TEXT(文本)
TEXT, TEXT(n), CHAR, CHAR(n), ALPHANUMERIC, ALPHANUMERIC(n), STRING, STRING(n), VARCHAR, VARCHAR(n), NTEXT(n), NCHAR, NCHAR(n), CHAR VARYING, CHAR VARYING(n), CHARACTER VARYING, CHARACTER VARYING(n), NATIONAL CHAR, NATIONAL CHAR(n), NATIONAL CHARACTER, NATIONAL CHARACTER(n), NATIONAL CHAR VARYING, NATIONAL CHAR VARYING(n), NATIONAL CHARACTER VARYING, NATIONAL CHARACTER VARYING(n)
最多可以有255个字符,每个字符两个子节(如果不进行压缩)。

MEMO(备注)
LONGTEXT, LONGCHAR, 注意, NTEXT
65,535 个字符;如果非二进制数据可以有2.14 GB


下面的CREATE TABLE语句示范了可以用来通过Access SQL View用户界面创建表的TEXT 和MEMO的不同形式的同义词。

CREATE TABLE tblUITextDataTypes (
Field1_TEXT TEXT,
Field2_TEXT25 TEXT(25),
Field3_MEMO MEMO,
Field4_CHAR CHAR,
Field5_CHAR25 CHAR(25),
Field6_LONGTEXT LONGTEXT,
Field7_LONGCHAR LONGCHAR,
Field8_ALPHA ALPHANUMERIC,
Field9_ALPHA25 ALPHANUMERIC(25),
Field10_STRING STRING,
Field11_STRING25 STRING(25),
Field12_VARCHAR VARCHAR,
Field13_VARCHAR25 VARCHAR(25),
Field14_NOTE NOTE)


如果用户通过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
Field1_NTEXT NTEXT,
Field2_NTEXT25 NTEXT(25),
Field3_NCHAR NCHAR,
Field4_NCHAR NCHAR(25),
Field5_VARYING CHAR VARYING,
Field6_VARYING CHAR VARYING(25),
Field7_VARYING CHARACTER VARYING,
Field8_VARYING CHARACTER VARYING(25),
Field9_NATIONAL NATIONAL CHAR,
Field10_NATIONAL NATIONAL CHAR(25),
Field11_NATIONAL NATIONAL CHARACTER,
Field12_NATIONAL NATIONAL CHARACTER(25),
Field13_NATIONAL NATIONAL CHAR VARYING,
Field14_NATIONAL NATIONAL CHAR VARYING(25),
Field15_NATIONAL NATIONAL CHARACTER VARYING,
Field16_NATIONAL NATIONAL CHARACTER VARYING(25))


如果用户通过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 (
CustomerID INTEGER CONSTRAINT
PK_tblCompCustomers PRIMARY KEY,
[Last Name] TEXT(50) WITH COMP NOT NULL,
[First Name] TEXT(50) WITH COMPRESSION NOT NULL,
Phone TEXT(10),
Email TEXT(50),
Address TEXT(40) DEFAULT Unknown)




注意WITH COMPRESSION 和WITH COMP关键字要在NOT NULL之前定义。用户也可以使用ALTER TABLE语句改变现存域的双字节编码的压缩属性,如下所示:

ALTER TABLE tblCustomers
ALTER COLUMN [Last Name] TEXT(50) WITH COMPRESSION


注意: 在上面的SQL语句中列示的WITH COMPRESSION and WITH COMP关键字只能通过Jet OLE DB provider 和ADO来执行,在Access SQL View的用户界面中使用将导致错误信息。

在用户设计数据表时采取那种数据类型取决于用户的应用程序的目的。如果该应用程序总是应用在Jet数据库的基础上,则应该使用最适宜的那些数据类型。但如果该应用程序最终要用到ODBC-compliant的数据库上,比如SQL Server 或 MSDE,则要使用那些是一致最方便的数据类型。



数字( NUMERIC)数据类型
数字(NUMERIC)数据类型是用来定义存储计算用数字的域的。通常,将某种NUMERIC类型与其他的区别开来的是用来存储数据的字节数,它也影响着所存储数字的精度。许多Jet SQL 的数据类型豆油协同义字可以用来进行定义,到底使用哪一个取决于该数据表是仅在某个Jet数据库中还是将移植到诸如Microsoft SQL Server的数据库服务器中。如果将进行移植,用户应选择那些使得移植最容易进行的数据类型。

下面的表格列示了基本的Jet NUMERIC数据类型,它的各种同义字以及为期分配的字节数。

Jet 数据类型
同义字
存储大小

TINYINT
INTEGER1, BYTE
1 byte

SMALLINT
SHORT, INTEGER2
2 bytes

INTEGER
LONG, INT, INTEGER4
4 bytes

REAL
SINGLE, FLOAT4, IEEESINGLE
4 bytes

FLOAT
DOUBLE, FLOAT8, IEEEDOUBLE, NUMBER
8 bytes

DECIMAL
NUMERIC, DEC
17 bytes


下面的CREATE TABLE 语句示范了各种可以在通过Access SQL View 的用户界面创建表时使用的SNUMERIC 数据类型。

CREATE TABLE tblUINumericDataTypes (
Field1_INT INT,
Field2_INTEGER INTEGER,
Field3_LONG LONG,
Field4_INTEGER1 INTEGER1,
Field5_BYTE BYTE,
Field6_NUMERIC NUMERIC,
Field7_REAL REAL,
Field8_SINGLE SINGLE,
Field9_FLOAT FLOAT,
Field10_FLOAT4 FLOAT4,
Field11_FLOAT8 FLOAT8,
Field12_DOUBLE DOUBLE,
Field13_IEEESINGLE IEEESINGLE,
Field14_IEEEDOUBLE IEEEDOUBLE,
Field15_NUMBER NUMBER,
Field16_SMALLINT SMALLINT,
Field17_SHORT SHORT,
Field18_INTEGER2 INTEGER2,
Field19_INTEGER4 INTEGER4)


虽然上面的SQL 语句也可以通过Jet OLE DB provider 和ADO来执行,仍有一些其他的NUMERIC 数据类型的形式只能通过Jet OLE DB provider 和 ADO来执行。

CREATE TABLE tblCodeNumericDataTypes (
Field1_TINYINT TINYINT,
Field2_DECIMAL DECIMAL,
Field3_DEC DECIMAL,
Field4_DPRECISION DOUBLE PRECISION)


注意: 上面的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 (
DefaultType DECIMAL,
SpecificType DECIMAL(10,5))


货币(CURRENCY)数据类型
货币(CURRENCY)数据类型是用来存储15位整数和4位小数的数字值的,它使用8个字节的存储量,其唯一的同义字是MONEY。

下面的CREATE TABLE 语句示范了CURRENCY 数据类型在创建数据表时的用法,它既可以在Access SQL View 用户界面中也可以在Jet OLE DB provider 和 ADO中使用。

CREATE TABLE tblCurrencyDataTypes (
Field1_CURRENCY CURRENCY,
Field2_MONEY MONEY)


是否(BOOLEAN )数据类型

是否(BOOLEAN)是逻辑数据类型,其值为是(TRUE)或否(FALSE)。它们使用一个字节的存储量,同义字有BIT、 LOGICAL、 LOGICAL1 和 YESNO。 True的值等于–1, False的值等于0。

下面的CREATE TABLE 语句示范了通过Jet OLE DB provider 和 ADO 来创建BOOLEAN 数据类型的不同形式。

CREATE TABLE tblUIBooleandataTypes (
Field1_BIT BIT,
Field2_LOGICAL LOGICAL,
Field3_LOGICAL1 LOGICAL1,
Field4_YESNO YESNO)


字节(BINARY )数据类型

字节(BINARY )数据类型以二进制的本来面目存储小容量的任何类型的数据。它对于所存储的每个字符只使用1个字节的存储量,用户可以指定所分配的字节数。如果没有制定字节数,缺省的值是510,这也是所能允许的最大字节数。它的同义字有BINARY、 VARBINARY和 BINARY VARYING。BINARY 数据类型在Access 用户界面中是不可用的。

下面的 CREATE TABLE 语句示范了可以用来在Access SQL View 用户界面中使用的BINARY 数据类型的不同形式。

CREATE TABLE tblUIBinaryDataTypes (
Field1_BINARY BINARY,
Field2_BINARY250 BINARY(250),
Field3_VARBINARY VARBINARY,
Field4_VARBINARY250 VARBINARY(250))


虽然上面的SQL语句也可以通过Jet OLE DB provider 和 ADO执行,但仍然有些其他的binary 数据类型的同义字只能通过Jet OLE DB provider 和 ADO来执行,如下所示:

CREATE TABLE tblCodeBinaryDataTypes (
Field1_BVARYING BINARY VARYING,
Field2_BVARYING250 BINARY VARYING(250))

OLEOBJECT 数据类型
OLEOBJECT 数据类型用来存储大的二进制对象,比如Word文档或者Excel表单。它的字节数并不确定,最大可达2.14 GB。其同义字有:IMAGE、LONGBINARY、GENERAL 和 OLEOBJECT

下面的 CREATE TABLE 语句展示了通过Access SQL View 用户界面或Jet OLE DB provider和ADO 来创建表时使用OLEOBJECT 数据类型。

CREATE TABLE tblImageDataTypes (
Field1_IMAGE IMAGE,
Field2_LONGBINARY LONGBINARY,
Field3_GENERAL GENERAL,
Field4_OLEOBJECT OLEOBJECT)


日期时间(DATETIME)数据类型

日期时间(DATETIME)数据类型用来存储日期、时间以及日期和时间的结合值,年数可以从100到 9999。它使用8个字节的存储量,其同义字有DATE、TIME、DATETIME和 TIMESTAMP

下面的 CREATE TABLE 语句展示了通过Access SQL View 用户界面或Jet OLE DB provider 和 ADO 创建表示所使用的DATETIME 数据类型的不同形式。

CREATE TABLE tblDateTimeDataTypes (
Field1_DATE DATE,
Field2_TIME TIME,
Field3_DATETIME DATETIME,
Field4_TIMESTAMP TIMESTAMP)


COUNTER 数据类型

COUNTER 数据类型用来存储长整型数值,该数值在表中每增加一条新的纪录时能够自动增加。使用COUNTER 数据类型,用户可以设定一个种子值和增加值,种子值是当第一个记录插入到表中时将输入到域中的数值,而增加值用来加到上一个记数值上作为下一个记数值。如果没有指定种子值和增加值,它们都将缺省的使用1。在一个表中只能有一个COUNTER域。其同义字有 COUNTER、AUTOINCREMENT和IDENTITY。

下面的 CREATE TABLE 语句展示了通过Access SQL View 用户界面创建表时使用的COUNTER 数据类型的同义字。

CREATE TABLE tblUICounterDataTypes (
Field1 COUNTER,
Field2 TEXT(10))


注意这里没有指定种子值和增加值,所有都将采用缺省值1。定义COUNTER 数据类型的另一种方式是使用AUTOINCREMENT 关键字,如下所示:

CREATE TABLE tblUICounterDataTypes (
Field1 AUTOINCREMENT(10,5),
Field2 TEXT(10))


这一次种子值和增加值都指定了,则开始值时10,每次将加5。上面的SQL 语句也可以通过Jet OLE DB provider 和 ADO执行,另外还有counter 数据类型的另一种形式,只能通过Jet OLE DB provider 和 ADO来执行,即IDENTITY 关键字,它和SQL Server的 IDENTITY 数据类型是相兼容的。

CREATE TABLE tblCodeCounterDataTypes
Field1_IDENTITY IDENTITY(10,5),
Field2 TEXT(10))


这里的种子值和增加值都可以通过ALTER TABLE 语句进行修改,修改后所有新插入的行将使用新的值。但是, COUNTER 数据类型常常都是用于主键的,而主键要求每列唯一。如果你改变了种子值, 将可能导致主键域的重复值,从而发生错误。

ALTER TABLE tblUICounterDataTypes
ALTER COLUMN Field1 COUNTER(10,10)
注意: 如果某个现存的列已经包含了数据的话,用户不能使用ALTER TABLE 语句来将该列的数据类型改变为COUNTER 数据类型。

在以前版本的Jet数据库中,压缩数据库之后,种子值将被置为可能的最大值。在Jet 4.0中仍然如此,只要种子值和增加值的采用的是缺省值1的话。如果用户指定了不等于缺省值的种子值和增加值,在压缩数据库是并不会重置种子值。

@@IDENTITY 变量

@@IDENTITY 变量是一个全局的SQL变量,用户可以用它来提取使用COUNTER数据类型的列的最后使用值。用户在提取@@IDENTITY 变量时,不能指定表的名称。返回值总是最近的通过代码插入了数据的表的COUNTER域。

SELECT @@IDENTITY
要给@@IDENTITY 值加上某个值,要将该变量用方括号括起来。

SELECT [@@IDENTITY] + 1
注意 上面SQL 语句中的@@IDENTITY变量只能通过Jet OLE DB provider 和 ADO执行提取,通过Access SQL View 用户界面提取的值将是0,另外,该值只有在通过代码插入记录时才会改变,如果通过用户接口,不管是数据表单、窗体还是Access SQL View窗口中的SQL语句, @@IDENTITY返回值都是0。因此, @@IDENTITY 的值只有在刚刚通过代码加入了记录是才是准确的。

要获得更详细的有关数据类型的说明,请在Office 助手中或在Microsoft Access 帮助的回答向导的标签页中输入ALTER TABLE ,然后单击查找。

阅读(1519) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~