MS Jet SQL for Access 2000中級篇
該系列的文章解釋了什么是Microsoft® Jet SQL,并說明了它如何在Access 2000的應(yīng)用程序中使用。本文是基礎(chǔ)、中級和高級三篇中的第二篇。這些文章循序漸進(jìn)的說明了使用Jet SQL的語法和一些方法,并示范了對于Access 2000來說較新的Jet SQL的特征。最后,本文的所有SQL參考都是針對Microsoft Jet 4.0 數(shù)據(jù)引擎所用的。
中級SQL說明
通過了解中級結(jié)構(gòu)化查詢語言的一些概念,用戶可以增強控制數(shù)據(jù)庫的結(jié)構(gòu)和對象的能力,并且可以通過許多有趣的和強有力的途徑操縱這些機構(gòu)中包含的數(shù)據(jù)。結(jié)合使用諸如DAO和ADO之類的數(shù)據(jù)訪問方法,中級SQL 可以很大程度的提高用戶應(yīng)用程序的靈活性及其表現(xiàn)。
基礎(chǔ)、中級和高級SQL的不同點
在基礎(chǔ)、中級和高級SQL之間劃分一條明顯的界限并不是一件容易的事情,在很多情況下,決定其所屬都只是簡單的決斷。但是對于該系列在Access 2000中使用SQL的文章來說,還考慮了如下的一些方面:
首先一點在于SQL語句本身的復(fù)雜級別。在前面的文章中,我們努力使用那些常用的語句,而且是最簡單的形式。本文則在前面基礎(chǔ)篇的基礎(chǔ)上介紹了更復(fù)雜的語句。
其次是在Access 2000中已經(jīng)包含了一些新的SQL語句、子句和關(guān)鍵詞。盡管在本文中仍將使用Access上一版本中所包含的SQL語句,但是一定會出現(xiàn)一些在Access中第一次出現(xiàn)的SQL語句,在高級SQL一文中也是如此。
最后,那些關(guān)于安全性和多用戶解決方案的SQL語句將在高級篇中介紹,因為這些語句常常是用于更復(fù)雜的應(yīng)用程序中的
通過使用中級SQL,用戶可以為你的Access應(yīng)用程序增加更強的靈活性和能力。盡管簡單的和直接的SQL語句能夠完成很多的事情,但是使用更復(fù)雜的語句將擴展在數(shù)據(jù)庫中訪問和處理信息的方法范圍。使用中級SQL也將使得用戶可以更好的控制你的數(shù)據(jù)庫使用和維護(hù)工作
增強SQL
在Access 2000中,為了支持Access的新特性,為了和ANSI-92的標(biāo)準(zhǔn)更加一致,并且允許在Access 和 Microsoft® SQL Server™間的更好的兼容性,包含在Microsoft Jet 4.0數(shù)據(jù)引擎中的SQL作了許多增強。Jet數(shù)據(jù)引擎現(xiàn)在有兩種格式的SQL語法:一種是支持以前使用的SQL語法,另一種是支持新的SQL語法規(guī)范。需要格外注意的是,只有在用戶使用ActiveX® Data Objects (ADO)和Jet OLE DB provider時新的語法才是可用的,而當(dāng)前通過Access SQL View接口或者DAO是無法使用新的語法的。本文指出只有通過Jet OLE DB provider 和 ADO才能夠使用某個特定的SQL命令。
在Access的上一版本中,數(shù)據(jù)訪問對象(DAO)是主要的數(shù)據(jù)訪問方法。而現(xiàn)在發(fā)生了改變,盡管DAO 仍舊被支持,但新的數(shù)據(jù)訪問方法是使用ADO。ADO是微軟的通用數(shù)據(jù)訪問戰(zhàn)略(Microsoft's Universal Data Access strategy)的一部分,其最基本的假設(shè)是無論數(shù)據(jù)存在那里都是可以訪問的,不管是數(shù)據(jù)庫、目錄結(jié)構(gòu)還是某重用戶自定義的數(shù)據(jù)庫。
在討論Microsoft Jet SQL 時,ADO是非常重要的,正如在前面提到的,一些新的SQL語句只有在使用ADO 和Jet OLE DB provider時才是可用的。在本文和與本文相配套的示范數(shù)據(jù)庫中,所有的代碼都是使用ADO些的。那些沒有特意指明為只有通過ADO才可用的SQL語句都可以通過Access SQL View 用戶接口或 DAO來執(zhí)行。詳盡的關(guān)于ADO的討論超出了本文的范圍,用戶可以在下面的網(wǎng)站中找到最近的信息
http://www.microsoft.com/data/ado/
SQL代碼規(guī)范
本文使用一致性的SQL代碼規(guī)范。與所有的代碼規(guī)范相同,目的是使用易讀和易于理解的方式來顯示代碼。這就要通過空格、換行和大寫關(guān)鍵字的結(jié)合使用來實現(xiàn)。通常來說,要使用大寫字母來打印SQL的關(guān)鍵字,如果SQL語句必須換行,盡量使SQL語句的主要部分一起換行。看過一些例子之后,相信讀者會對此有較好的感覺。
不合格式的SQL代碼
CREATE TABLE tblCustomers (CustomerID INTEGER NOT NULL, [Last Name] TEXT(50) NOT NULL, [First Name] TEXT(50) NOT NULL, Phone TEXT(10), Email TEXT(50))
良好格式的SQL代碼
CREATE TABLE tblCustomers (
...CustomerID INTEGER NOT NULL,
...[Last Name] TEXT(5) NOT NULL,
...[First Name] TEXT(50) NOT NULL,
...Phone TEXT(10),
...Email TEXT(50))
改變數(shù)據(jù)表
在建立或倒入一個數(shù)據(jù)表之后,用戶可能需要修改表的設(shè)計。這時就可以使用ALTER TABLE語句。但是注意,改變現(xiàn)存的表的結(jié)構(gòu)可能會導(dǎo)致用戶丟失一些數(shù)據(jù)。比如,改變一個域的數(shù)據(jù)類型將導(dǎo)致數(shù)據(jù)丟失或舍入錯誤,這取決于用戶現(xiàn)在使用的數(shù)據(jù)類型。改變數(shù)據(jù)表也可能會破壞用戶的應(yīng)用程序中涉及到所改變的域的部分。所以用戶在修改現(xiàn)有表的結(jié)構(gòu)之前一定要格外小心。
使用ALTER TABLE 語句,用戶可以增加,刪除或改變列或域,也可以增加或刪除一個約束。還可以為某個域設(shè)定缺省值,但是一次只能修改一個域。假設(shè)我們有一個記賬單的數(shù)據(jù)庫,而我們想在顧客數(shù)據(jù)表中增加一個域,這時可以使用ALTER TABLE 語句,在其ADD COLUMN 子句后寫上域的名稱、數(shù)據(jù)類型和數(shù)據(jù)的大。ㄈ绻枰脑挘
ALTER TABLE tblCustomers
ADD COLUMN Address TEXT(30)
要改變域的數(shù)據(jù)類型或大小,可以使用ALTER COLUMN子句,在后面加上期望的數(shù)據(jù)類型和數(shù)據(jù)的大小。
ALTER TABLE tblCustomers
ALTER COLUMN Address TEXT(40)
如果需要改變域的名稱,則必須刪除該域并重新創(chuàng)建。刪除一個域要使用DROP COLUMN 子句,在其后跟上域的名稱。
ALTER TABLE tblCustomers
DROP COLUMN Address
注意使用這種方法將會刪除該域的現(xiàn)存數(shù)據(jù)。如果需要保存這些數(shù)據(jù),則用戶需要在Access的用戶界面的設(shè)計模式中改變該域的名稱,或者編寫代碼將現(xiàn)存的數(shù)據(jù)保存在一個臨時的表中然后將其添加到改名后的表中。
缺省值是指在表中增加新紀(jì)錄并且沒有為該列賦值時自動填充到該域中的值。為某域設(shè)置缺省值,要在定義域的類型后使用使用DEFAULT關(guān)鍵字,不管是使用ADD COLUMN或 ALTER COLUMN 子句。
ALTER TABLE tblCustomers
ALTER COLUMN Address TEXT(40) DEFAULT Unknown
注意缺省值并不使用單引號包含,如果用了單引號,則引號也會插入到記錄中。在CREATE TABLE語句中也可以使用DEFAULT關(guān)鍵字。
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中可以執(zhí)行,在Access SQL View的用戶界面中使用將會返回錯誤信息。
下面的部分將討論如何在ALTER TABLE語句中使用約束。要獲得更詳細(xì)的有關(guān)ALTER TABLE的說明,請在Office 助手中或在Microsoft Access 幫助的回答向?qū)У臉?biāo)簽頁中輸入ALTER TABLE ,然后單擊查找。
約束
在《Access 2000的基礎(chǔ)Microsoft Jet SQL》一文中,我們討論了建立表之間的聯(lián)系的約束方法。約束也能用于建立主鍵和參考完整性,來限制插入到一個域中的數(shù)據(jù)值。通常,約束可以用于保持用戶數(shù)據(jù)庫中的數(shù)據(jù)完整性和一致性。
共有兩種類型的約束:單數(shù)據(jù)域(或稱域級的)的約束和多數(shù)據(jù)域(或稱表級的)的約束。兩種約束都可以用在CREATE TABLE 或 ALTER TABLE 語句中。
單域的約束,也就是通常所說的列級的約束,是在域及其數(shù)據(jù)類型定義后針對該域定義的。下面我們使用用戶表,在CustomerID域生成一個單域的主鍵。增加約束時,在域名后使用CONSTRAINT關(guān)鍵字。
ALTER TABLE tblCustomers
ALTER COLUMN CustomerID INTEGER
CONSTRAINT PK_tblCustomers PRIMARY KEY
注意這里給出了約束的名稱。用戶還可以在定義主鍵時使用簡稱而省略CONSTRAINT子句。
ALTER TABLE tblCustomers
ALTER COLUMN CustomerID INTEGER PRIMARY KEY
然而,使用簡稱的方法將導(dǎo)致Access隨機的生成約束的名稱,從而使得在代碼中難以引用。所以,最好給約束制定名稱。
要刪除一個約束,可以在ALTER TABLE 語句中使用DROP CONSTRAINT 子句,并給出約束的名稱。
ALTER TABLE tblCustomers
DROP CONSTRAINT PK_tblCustomers
約束還可以用來給域限制允許值。用戶可以將限制值設(shè)為非空(NOT NULL)或唯一( UNIQUE),或者定義一個檢驗性的約束,該約束指一種可以應(yīng)用于某個域的規(guī)則。比如用戶希望限制姓和名的域是唯一的,就意味著在表中永遠(yuǎn)不會有兩個相同姓名的記錄存在。這是因為這種約束是多域的性的,是在表的級別定義的,而非域的級別。使用ADD CONSTRAINT子句可以定義一個多域的列表。
ALTER TABLE tblCustomers
ADD CONSTRAINT CustomerNames UNIQUE
([Last Name], [First Name])
注意: 我們在這里只是示范一下如何使用約束,而在實際的應(yīng)用程序中,用戶可能并不希望徹底限制姓名的唯一性。
檢驗性約束是一種新的強有力的SQL特性,它通過一個表達(dá)式從而允許用戶在表中添加數(shù)據(jù)合法性檢驗,該表達(dá)式可以指向一個單域,也可以指向跨越一個或多個表的多個域。比如用戶希望確定輸入到發(fā)票記錄中的數(shù)值是否總是大于0,則可以在ALTER TABLE語句的ADD CONSTRAINT子句中定義一個CHECK關(guān)鍵字。
ALTER TABLE tblInvoices
ADD CONSTRAINT CheckAmount
CHECK (Amount > 0)
注意: 檢驗性約束語句只能通過Jet OLE DB provider和ADO來執(zhí)行,在Access SQL View的用戶界面中使用將返回錯誤信息。而且,要刪除一個檢驗性約束,也必須在Jet OLE DB provider 和ADO中執(zhí)行DROP CONSTRAINT語句。另外,如果用戶已經(jīng)定義了一個檢驗性約束: (1) 在Access的用戶界面中并不會顯示為一個合法性規(guī)則,(2) 用戶也不能在該界面中定義合法性文本的屬性,否則將給出一般性錯誤信息,(3) 在用戶通過ADO使用DROP CONSTRAINT語句之前,不能夠通過Access的用戶界面或者在代碼中刪除數(shù)據(jù)表。
用來定義一個檢驗性約束的表達(dá)式也可以用來指向同一個表中的多個域,甚至是其他表中的域。其中可以使用任何在Microsoft Jet SQL 中合法的操作符,比如SELECT 語句、數(shù)學(xué)運算符、以及集合函數(shù)等。用來定義檢驗性約束的表達(dá)式的長度不能超過64個字符。
設(shè)想用戶希望在將顧客加入到Customers 表之前檢查每個顧客的信用額度。則可以使用帶有ADD COLUMN 和CONSTRAINT 子句的ALTER TABLE 語句生成一個約束,該約束將查找在CreditLimit表中的值來驗證顧客的信用額度。下面的SQL語句將生成一個tblCreditLimit 表,然后將CustomerLimit域加入到tblCustomers 表中,并將檢驗性約束加到tblCustomers表,最后對該檢驗性約束進(jìn)行測試。
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
注意:當(dāng)用戶執(zhí)行UPDATE TABLE語句時,將被提示更新失敗,因為該語句違反了檢驗性約束。如果用戶使用小于等于100的值來更新CustomerLimit域,就能夠成功。
約束-II
級聯(lián)性更新和刪除
約束還可以用來在數(shù)據(jù)庫中的表間建立參考完整性。具有參考完整性意味著數(shù)據(jù)是一致的和未被破壞的。比如,如果刪除了一個顧客的記錄但是該顧客的運單記錄仍舊存在數(shù)據(jù)庫中,這時數(shù)據(jù)就是非一致的,即指數(shù)據(jù)庫中存在著一個孤立的顧客運單記錄。參考完整性是在用戶建立各個表間的關(guān)系時建立的。除了建立參考完整性之外,用戶還可以使用級聯(lián)性更新和刪除來確保相互參考的表保持同步。例如,一旦定義了級聯(lián)性更新和刪除,當(dāng)用戶刪除顧客記錄時,該顧客的運單記錄也將自動刪除。
要使用級聯(lián)性更新和刪除,用戶可以在ALTER TABLE 語句的CONSTRAINT子句中使用ON UPDATE CASCADE 和/或 ON DELETE CASCADE 關(guān)鍵字。注意他們都必須是應(yīng)用于外鍵的。
ALTER TABLE tblShipping
ADD CONSTRAINT FK_tblShipping
FOREIGN KEY (CustomerID) REFERENCES
tblCustomers (CustomerID)
ON UPDATE CASCADE
ON DELETE CASCADE
外鍵
在處理外鍵時,有關(guān)快速外鍵(fast foreign key)的概念是很有用的?焖偻怄I即是一種沒有索引的外鍵。盡管這乍聽起來有點不合理,但卻可以得到很好的解釋。在缺省情況下,一旦定義了一個外鍵,將會自動生成一個基于該外鍵中列的索引,這在很多情況下提高了執(zhí)行保持參考完整性的操作的表現(xiàn)。然而,如果在定義外鍵的域中存在許多重復(fù)值,外鍵索引將會影響增加和刪除數(shù)據(jù)使得效率。要防止基于外鍵的索引的生成,我們可以在定義外鍵是NO INDEX關(guān)鍵字。
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來執(zhí)行。在Access SQL View的用戶界面中使用將返回錯誤信息。而且,要刪除一個快速外鍵,也必須在Jet OLE DB provider 和ADO中執(zhí)行DROP CONSTRAINT語句。
在記錄按序排列的數(shù)據(jù)庫應(yīng)用中,快速外鍵也將發(fā)揮作用。比如這里有一個用來辨別所跟蹤的顧客類型的 CustomerTypes的表,一個Customer 表和一個Orders 表。在CustomerTypes表中有10行,在 Customer 表中有100000行,在Orders表中有350000行。這時采用在Customers 表中指向CustomerTypes表中的主鍵的快速外鍵將是很好的選擇,因為在100000行記錄外最多只有10行唯一的記錄。這時索引對于提取數(shù)據(jù)毫無用處,并且在CustomerType中插入、刪除和更新數(shù)據(jù)是成為累贅。
而另一方面,快速外鍵應(yīng)用于Orders 表中的CustomerID 列很可能是沒有用處的,因為那些值每一個都代表了不同的客戶,所以一般是唯一的。在這種情況下,使用通常的帶有索引的外鍵將會很有裨益,這是因為它是應(yīng)用在連結(jié)和其他查找規(guī)則上的。
注意: 盡管在本節(jié)的大部分例子中使用的是ALTER TABLE語句,但是所有這些都是可以寫在CREATE TABLE 語句中的。
要了解有關(guān)CONSTRAINT子句的更多信息,請在Office 助手中或在Microsoft Access 幫助的回答向?qū)У臉?biāo)簽頁中輸入ALTER TABLE ,然后單擊查找。
數(shù)據(jù)類型
在努力使基Jet數(shù)據(jù)引擎的Access應(yīng)用程序易于向那些基于Microsoft SQL Server 或 MSDE的應(yīng)用轉(zhuǎn)化方面,Jet 數(shù)據(jù)引擎改變了一些數(shù)據(jù)類型,增加了一些新的數(shù)據(jù)類型字。下面的部分將討論主要的數(shù)據(jù)類型及其如何實現(xiàn)的。
文本(TEXT)數(shù)據(jù)類型
文本(TEXT)數(shù)據(jù)類型是用來設(shè)置一個可以存儲純文本的域的,也可以用來存儲同時包含文本和數(shù)字的內(nèi)容,但其中的數(shù)字并不是用于計算的,比如電話號碼或者電子郵件地址。當(dāng)用戶通過ACESS的用戶界面創(chuàng)建表時,用戶有兩種基本的文本類型:文本(TEXT)和備注(MEMO)。但是通過SQL語句如CREATE TABLE或者 ALTER TABLE 來創(chuàng)建表時,則還有其他許多的TEXT 和 MEMO類型的同義字可供選擇。
總的來說,文本域最多可以有255個字符,而備注域則最多可以有65,535 個字符,但是如果備注域不包含任何二進(jìn)制數(shù)據(jù)的話,其唯一的限制就是整個數(shù)據(jù)庫的最大容量(大概是2.14GB 或 1,070,000,000 雙字節(jié)字符)。另外,沒有用到的文本與部分并不會保存在內(nèi)存中。
下面的表格列示了最基本的Jet 文本數(shù)據(jù)類型,它的同義字以及所分配的字節(jié)數(shù)。
Jet 數(shù)據(jù)類型
同義字
存儲容量
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個字符,每個字符兩個子節(jié)(如果不進(jìn)行壓縮)。
MEMO(備注)
LONGTEXT, LONGCHAR, 注意, NTEXT
65,535 個字符;如果非二進(jìn)制數(shù)據(jù)可以有2.14 GB
下面的CREATE TABLE語句示范了可以用來通過Access SQL View用戶界面創(chuàng)建表的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表的設(shè)計的話,將會看到MEMO、 LONGTEXT、 LONGCHAR、和注意同義字都是MEMO 的數(shù)據(jù)類型,其他的所有同義字都是TEXT數(shù)據(jù)類型。對于那些沒有定義長度的TEXT 數(shù)據(jù)類型,缺省的長度為255個字符。
雖說上面的SQL語句也可以通過Jet OLE DB provider和 ADO來執(zhí)行,但還是有一些其他的TEXT 和MEMO 數(shù)據(jù)類型的不同定義只能通過Jet OLE DB provider 和ADO來執(zhí)行。
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表的設(shè)計的話,將會看到只有NCHAR數(shù)據(jù)類型是MEMO,其他的都是TEXT數(shù)據(jù)類型。對于那些沒有定義長度的TEXT 數(shù)據(jù)類型,缺省的長度為255個字符。
注意: 在上面的SQL語句中列示的這些數(shù)據(jù)類型只能通過Jet OLE DB provider 和ADO來執(zhí)行,在Access SQL View的用戶界面中使用將導(dǎo)致錯誤信息。還要注意如果通過Jet OLE DB provider和 ADO創(chuàng)建了一個TEXT數(shù)據(jù)類型的域,則通過Access用戶界面看到的將是MEMO的數(shù)據(jù)類型。
Unicode壓縮
現(xiàn)在在Microsoft Jet 4.0 數(shù)據(jù)引擎中,所有的TEXT數(shù)據(jù)類型都是以兩個字節(jié)的統(tǒng)一編碼形式存儲的。它取代了前面版本中采用的多字節(jié)字符集(Multi-byte Character Set ,MBCS)格式。雖然雙字節(jié)的格式需要更多的空間來存儲每個字符,但可以定義使用TEXT數(shù)據(jù)類型的自動進(jìn)行壓縮。
在用戶使用SQL建立的TEXT的數(shù)據(jù)類型時,雙字節(jié)編碼的壓縮屬性缺省設(shè)置為NO,如果需要將該屬性設(shè)置為Yes,用戶可以在定義域的時候使用WITHCOMPRESSION (或者 WITH COMP)關(guān)鍵字。
下面的CREATE TABLE 語句將創(chuàng)建一個新的顧客表,這里將雙字節(jié)編碼的壓縮屬性設(shè)置為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關(guān)鍵字要在NOT NULL之前定義。用戶也可以使用ALTER TABLE語句改變現(xiàn)存域的雙字節(jié)編碼的壓縮屬性,如下所示:
ALTER TABLE tblCustomers
ALTER COLUMN [Last Name] TEXT(50) WITH COMPRESSION
注意: 在上面的SQL語句中列示的WITH COMPRESSION and WITH COMP關(guān)鍵字只能通過Jet OLE DB provider 和ADO來執(zhí)行,在Access SQL View的用戶界面中使用將導(dǎo)致錯誤信息。
在用戶設(shè)計數(shù)據(jù)表時采取那種數(shù)據(jù)類型取決于用戶的應(yīng)用程序的目的。如果該應(yīng)用程序總是應(yīng)用在Jet數(shù)據(jù)庫的基礎(chǔ)上,則應(yīng)該使用最適宜的那些數(shù)據(jù)類型。但如果該應(yīng)用程序最終要用到ODBC-compliant的數(shù)據(jù)庫上,比如SQL Server 或 MSDE,則要使用那些是一致最方便的數(shù)據(jù)類型。
數(shù)字( NUMERIC)數(shù)據(jù)類型
數(shù)字(NUMERIC)數(shù)據(jù)類型是用來定義存儲計算用數(shù)字的域的。通常,將某種NUMERIC類型與其他的區(qū)別開來的是用來存儲數(shù)據(jù)的字節(jié)數(shù),它也影響著所存儲數(shù)字的精度。許多Jet SQL 的數(shù)據(jù)類型豆油協(xié)同義字可以用來進(jìn)行定義,到底使用哪一個取決于該數(shù)據(jù)表是僅在某個Jet數(shù)據(jù)庫中還是將移植到諸如Microsoft SQL Server的數(shù)據(jù)庫服務(wù)器中。如果將進(jìn)行移植,用戶應(yīng)選擇那些使得移植最容易進(jìn)行的數(shù)據(jù)類型。
下面的表格列示了基本的Jet NUMERIC數(shù)據(jù)類型,它的各種同義字以及為期分配的字節(jié)數(shù)。
Jet 數(shù)據(jù)類型
同義字
存儲大小
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 的用戶界面創(chuàng)建表時使用的SNUMERIC 數(shù)據(jù)類型。
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來執(zhí)行,仍有一些其他的NUMERIC 數(shù)據(jù)類型的形式只能通過Jet OLE DB provider 和 ADO來執(zhí)行。
CREATE TABLE tblCodeNumericDataTypes (
Field1_TINYINT TINYINT,
Field2_DECIMAL DECIMAL,
Field3_DEC DECIMAL,
Field4_DPRECISION DOUBLE PRECISION)
注意: 上面的SQL 語句中的數(shù)據(jù)類型只能通過Jet OLE DB provider 和 ADO來執(zhí)行,在Access SQL View的用戶界面中使用將導(dǎo)致錯誤信息。還要注意如果通過Access SQL View 建立了一個NUMERIC 數(shù)據(jù)類型的域,通過Access 用戶界面察看表的設(shè)計時看到的將是DOUBLE 數(shù)據(jù)類型,但是如果通過Jet OLE DB provider 和 ADO建立NUMERIC數(shù)據(jù)類型,通過Access 用戶界面看到的將是DECIMAL數(shù)據(jù)類型.
使用新的DECIMAL 數(shù)據(jù)類型,用戶可以設(shè)定數(shù)值的精度和小數(shù)位。精度就是該域所能包含的數(shù)字的總數(shù),而小數(shù)位則決定了小數(shù)點右面能有幾位數(shù)字,精度缺省值是18,最大的允許值28,而小數(shù)位缺省的是0,最大值時28。
CREATE TABLE tblDecimalDataTypes (
DefaultType DECIMAL,
SpecificType DECIMAL(10,5))
貨幣(CURRENCY)數(shù)據(jù)類型
貨幣(CURRENCY)數(shù)據(jù)類型是用來存儲15位整數(shù)和4位小數(shù)的數(shù)字值的,它使用8個字節(jié)的存儲量,其唯一的同義字是MONEY。
下面的CREATE TABLE 語句示范了CURRENCY 數(shù)據(jù)類型在創(chuàng)建數(shù)據(jù)表時的用法,它既可以在Access SQL View 用戶界面中也可以在Jet OLE DB provider 和 ADO中使用。
CREATE TABLE tblCurrencyDataTypes (
Field1_CURRENCY CURRENCY,
Field2_MONEY MONEY)
是否(BOOLEAN )數(shù)據(jù)類型
是否(BOOLEAN)是邏輯數(shù)據(jù)類型,其值為是(TRUE)或否(FALSE)。它們使用一個字節(jié)的存儲量,同義字有BIT、 LOGICAL、 LOGICAL1 和 YESNO。 True的值等于–1, False的值等于0。
下面的CREATE TABLE 語句示范了通過Jet OLE DB provider 和 ADO 來創(chuàng)建BOOLEAN 數(shù)據(jù)類型的不同形式。
CREATE TABLE tblUIBooleandataTypes (
Field1_BIT BIT,
Field2_LOGICAL LOGICAL,
Field3_LOGICAL1 LOGICAL1,
Field4_YESNO YESNO)
字節(jié)(BINARY )數(shù)據(jù)類型
字節(jié)(BINARY )數(shù)據(jù)類型以二進(jìn)制的本來面目存儲小容量的任何類型的數(shù)據(jù)。它對于所存儲的每個字符只使用1個字節(jié)的存儲量,用戶可以指定所分配的字節(jié)數(shù)。如果沒有制定字節(jié)數(shù),缺省的值是510,這也是所能允許的最大字節(jié)數(shù)。它的同義字有BINARY、 VARBINARY和 BINARY VARYING。BINARY 數(shù)據(jù)類型在Access 用戶界面中是不可用的。
下面的 CREATE TABLE 語句示范了可以用來在Access SQL View 用戶界面中使用的BINARY 數(shù)據(jù)類型的不同形式。
CREATE TABLE tblUIBinaryDataTypes (
Field1_BINARY BINARY,
Field2_BINARY250 BINARY(250),
Field3_VARBINARY VARBINARY,
Field4_VARBINARY250 VARBINARY(250))
雖然上面的SQL語句也可以通過Jet OLE DB provider 和 ADO執(zhí)行,但仍然有些其他的binary 數(shù)據(jù)類型的同義字只能通過Jet OLE DB provider 和 ADO來執(zhí)行,如下所示:
CREATE TABLE tblCodeBinaryDataTypes (
Field1_BVARYING BINARY VARYING,
Field2_BVARYING250 BINARY VARYING(250))
OLEOBJECT 數(shù)據(jù)類型
OLEOBJECT 數(shù)據(jù)類型用來存儲大的二進(jìn)制對象,比如Word文檔或者Excel表單。它的字節(jié)數(shù)并不確定,最大可達(dá)2.14 GB。其同義字有:IMAGE、LONGBINARY、GENERAL 和 OLEOBJECT
下面的 CREATE TABLE 語句展示了通過Access SQL View 用戶界面或Jet OLE DB provider和ADO 來創(chuàng)建表時使用OLEOBJECT 數(shù)據(jù)類型。
CREATE TABLE tblImageDataTypes (
Field1_IMAGE IMAGE,
Field2_LONGBINARY LONGBINARY,
Field3_GENERAL GENERAL,
Field4_OLEOBJECT OLEOBJECT)
日期時間(DATETIME)數(shù)據(jù)類型
日期時間(DATETIME)數(shù)據(jù)類型用來存儲日期、時間以及日期和時間的結(jié)合值,年數(shù)可以從100到 9999。它使用8個字節(jié)的存儲量,其同義字有DATE、TIME、DATETIME和 TIMESTAMP
下面的 CREATE TABLE 語句展示了通過Access SQL View 用戶界面或Jet OLE DB provider 和 ADO 創(chuàng)建表示所使用的DATETIME 數(shù)據(jù)類型的不同形式。
CREATE TABLE tblDateTimeDataTypes (
Field1_DATE DATE,
Field2_TIME TIME,
Field3_DATETIME DATETIME,
Field4_TIMESTAMP TIMESTAMP)
COUNTER 數(shù)據(jù)類型
COUNTER 數(shù)據(jù)類型用來存儲長整型數(shù)值,該數(shù)值在表中每增加一條新的紀(jì)錄時能夠自動增加。使用COUNTER 數(shù)據(jù)類型,用戶可以設(shè)定一個種子值和增加值,種子值是當(dāng)?shù)谝粋記錄插入到表中時將輸入到域中的數(shù)值,而增加值用來加到上一個記數(shù)值上作為下一個記數(shù)值。如果沒有指定種子值和增加值,它們都將缺省的使用1。在一個表中只能有一個COUNTER域。其同義字有 COUNTER、AUTOINCREMENT和IDENTITY。
下面的 CREATE TABLE 語句展示了通過Access SQL View 用戶界面創(chuàng)建表時使用的COUNTER 數(shù)據(jù)類型的同義字。
CREATE TABLE tblUICounterDataTypes (
Field1 COUNTER,
Field2 TEXT(10))
注意這里沒有指定種子值和增加值,所有都將采用缺省值1。定義COUNTER 數(shù)據(jù)類型的另一種方式是使用AUTOINCREMENT 關(guān)鍵字,如下所示:
CREATE TABLE tblUICounterDataTypes (
Field1 AUTOINCREMENT(10,5),
Field2 TEXT(10))
這一次種子值和增加值都指定了,則開始值時10,每次將加5。上面的SQL 語句也可以通過Jet OLE DB provider 和 ADO執(zhí)行,另外還有counter 數(shù)據(jù)類型的另一種形式,只能通過Jet OLE DB provider 和 ADO來執(zhí)行,即IDENTITY 關(guān)鍵字,它和SQL Server的 IDENTITY 數(shù)據(jù)類型是相兼容的。
CREATE TABLE tblCodeCounterDataTypes
Field1_IDENTITY IDENTITY(10,5),
Field2 TEXT(10))
這里的種子值和增加值都可以通過ALTER TABLE 語句進(jìn)行修改,修改后所有新插入的行將使用新的值。但是, COUNTER 數(shù)據(jù)類型常常都是用于主鍵的,而主鍵要求每列唯一。如果你改變了種子值, 將可能導(dǎo)致主鍵域的重復(fù)值,從而發(fā)生錯誤。
ALTER TABLE tblUICounterDataTypes
ALTER COLUMN Field1 COUNTER(10,10)
注意: 如果某個現(xiàn)存的列已經(jīng)包含了數(shù)據(jù)的話,用戶不能使用ALTER TABLE 語句來將該列的數(shù)據(jù)類型改變?yōu)镃OUNTER 數(shù)據(jù)類型。
在以前版本的Jet數(shù)據(jù)庫中,壓縮數(shù)據(jù)庫之后,種子值將被置為可能的最大值。在Jet 4.0中仍然如此,只要種子值和增加值的采用的是缺省值1的話。如果用戶指定了不等于缺省值的種子值和增加值,在壓縮數(shù)據(jù)庫是并不會重置種子值。
@@IDENTITY 變量
@@IDENTITY 變量是一個全局的SQL變量,用戶可以用它來提取使用COUNTER數(shù)據(jù)類型的列的最后使用值。用戶在提取@@IDENTITY 變量時,不能指定表的名稱。返回值總是最近的通過代碼插入了數(shù)據(jù)的表的COUNTER域。
SELECT @@IDENTITY
要給@@IDENTITY 值加上某個值,要將該變量用方括號括起來。
SELECT [@@IDENTITY] + 1
注意 上面SQL 語句中的@@IDENTITY變量只能通過Jet OLE DB provider 和 ADO執(zhí)行提取,通過Access SQL View 用戶界面提取的值將是0,另外,該值只有在通過代碼插入記錄時才會改變,如果通過用戶接口,不管是數(shù)據(jù)表單、窗體還是Access SQL View窗口中的SQL語句, @@IDENTITY返回值都是0。因此, @@IDENTITY 的值只有在剛剛通過代碼加入了記錄是才是準(zhǔn)確的。
要獲得更詳細(xì)的有關(guān)數(shù)據(jù)類型的說明,請在Office 助手中或在Microsoft Access 幫助的回答向?qū)У臉?biāo)簽頁中輸入ALTER TABLE ,然后單擊查找
(責(zé)任編輯:admin)
- ·VBA編程常用語句300句
- ·SQL基礎(chǔ):常用SQL語句詳解 (轉(zhuǎn))
- ·Sql和Access操作數(shù)據(jù)庫結(jié)構(gòu)的常用Sql
- ·多表查詢技巧
- ·ACCESS學(xué)習(xí)日記
- ·Oracle數(shù)據(jù)庫EXP、IMP命令語句使用方法
- ·SQL注入的高級應(yīng)用ACCESS篇!
- ·MS Jet SQL for A
- ·代碼打開頁面設(shè)置
- ·龍芯千元電腦配置曝光 商用化產(chǎn)品
- ·神州數(shù)碼爭搶國內(nèi)IT人才 開始校園
- ·聯(lián)合證券研究所:IT專業(yè)連鎖 家電
- ·傳臺灣新浪將出售 新浪官方并未否
- ·朗科起訴索尼跨國專利案和解 雙方
- ·傳英特爾向?qū)κ滞⑹〾?nbsp;要求其退
- ·批量去除通過ODBC連接到SQL Serve