改變數(shù)據(jù)表
在建立或倒入一個(gè)數(shù)據(jù)表之后,用戶可能需要修改表的設(shè)計(jì)。這時(shí)就可以使用ALTER TABLE語(yǔ)句。但是注意,改變現(xiàn)存的表的結(jié)構(gòu)可能會(huì)導(dǎo)致用戶丟失一些數(shù)據(jù)。比如,改變一個(gè)域的數(shù)據(jù)類型將導(dǎo)致數(shù)據(jù)丟失或舍入錯(cuò)誤,這取決于用戶現(xiàn)在使用的數(shù)據(jù)類型。改變數(shù)據(jù)表也可能會(huì)破壞用戶的應(yīng)用程序中涉及到所改變的域的部分。所以用戶在修改現(xiàn)有表的結(jié)構(gòu)之前一定要格外小心。
使用ALTER TABLE 語(yǔ)句,用戶可以增加,刪除或改變列或域,也可以增加或刪除一個(gè)約束。還可以為某個(gè)域設(shè)定缺省值,但是一次只能修改一個(gè)域。假設(shè)我們有一個(gè)記賬單的數(shù)據(jù)庫(kù),而我們想在顧客數(shù)據(jù)表中增加一個(gè)域,這時(shí)可以使用ALTER TABLE 語(yǔ)句,在其ADD COLUMN 子句后寫(xiě)上域的名稱、數(shù)據(jù)類型和數(shù)據(jù)的大?。ㄈ绻枰脑挘?BR> 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)建。刪除一個(gè)域要使用DROP COLUMN 子句,在其后跟上域的名稱。
ALTER TABLE tblCustomers
DROP COLUMN Address
注意使用這種方法將會(huì)刪除該域的現(xiàn)存數(shù)據(jù)。如果需要保存這些數(shù)據(jù),則用戶需要在access的用戶界面的設(shè)計(jì)模式中改變?cè)撚虻拿Q,或者編寫(xiě)代碼將現(xiàn)存的數(shù)據(jù)保存在一個(gè)臨時(shí)的表中然后將其添加到改名后的表中。
缺省值是指在表中增加新紀(jì)錄并且沒(méi)有為該列賦值時(shí)自動(dòng)填充到該域中的值。為某域設(shè)置缺省值,要在定義域的類型后使用使用DEFAULT關(guān)鍵字,不管是使用ADD COLUMN或 ALTER COLUMN 子句。
ALTER TABLE tblCustomers
ALTER COLUMN Address TEXT(40) DEFAULT Unknown
注意缺省值并不使用單引號(hào)包含,如果用了單引號(hào),則引號(hào)也會(huì)插入到記錄中。在CREATE TABLE語(yǔ)句中也可以使用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 語(yǔ)句只有在Jet OLE DB provider和ADO中可以執(zhí)行,在access SQL View的用戶界面中使用將會(huì)返回錯(cuò)誤信息。
下面的部分將討論如何在ALTER TABLE語(yǔ)句中使用約束。要獲得更詳細(xì)的有關(guān)ALTER TABLE的說(shuō)明,請(qǐng)?jiān)贠ffice 助手中或在Microsoft access 幫助的回答向?qū)У臉?biāo)簽頁(yè)中輸入ALTER TABLE ,然后單擊查找。
約束
在《access 2000的基礎(chǔ)Microsoft Jet SQL》一文中,我們討論了建立表之間的聯(lián)系的約束方法。約束也能用于建立主鍵和參考完整性,來(lái)限制插入到一個(gè)域中的數(shù)據(jù)值。通常,約束可以用于保持用戶數(shù)據(jù)庫(kù)中的數(shù)據(jù)完整性和一致性。
共有兩種類型的約束:?jiǎn)螖?shù)據(jù)域(或稱域級(jí)的)的約束和多數(shù)據(jù)域(或稱表級(jí)的)的約束。兩種約束都可以用在CREATE TABLE 或 ALTER TABLE 語(yǔ)句中。
單域的約束,也就是通常所說(shuō)的列級(jí)的約束,是在域及其數(shù)據(jù)類型定義后針對(duì)該域定義的。下面我們使用用戶表,在CustomerID域生成一個(gè)單域的主鍵。增加約束時(shí),在域名后使用CONSTRAINT關(guān)鍵字。
ALTER TABLE tblCustomers
ALTER COLUMN CustomerID INTEGER
CONSTRAINT PK_tblCustomers PRIMARY KEY
注意這里給出了約束的名稱。用戶還可以在定義主鍵時(shí)使用簡(jiǎn)稱而省略CONSTRAINT子句。
ALTER TABLE tblCustomers
ALTER COLUMN CustomerID INTEGER PRIMARY KEY
然而,使用簡(jiǎn)稱的方法將導(dǎo)致access隨機(jī)的生成約束的名稱,從而使得在代碼中難以引用。所以,給約束制定名稱。
要?jiǎng)h除一個(gè)約束,可以在ALTER TABLE 語(yǔ)句中使用DROP CONSTRAINT 子句,并給出約束的名稱。
ALTER TABLE tblCustomers
DROP CONSTRAINT PK_tblCustomers
約束還可以用來(lái)給域限制允許值。用戶可以將限制值設(shè)為非空(NOT NULL)或( UNIQUE),或者定義一個(gè)檢驗(yàn)性的約束,該約束指一種可以應(yīng)用于某個(gè)域的規(guī)則。比如用戶希望限制姓和名的域是的,就意味著在表中永遠(yuǎn)不會(huì)有兩個(gè)相同姓名的記錄存在。這是因?yàn)檫@種約束是多域的性的,是在表的級(jí)別定義的,而非域的級(jí)別。使用ADD CONSTRAINT子句可以定義一個(gè)多域的列表。
ALTER TABLE tblCustomers
ADD CONSTRAINT CustomerNames UNIQUE
([Last Name], [First Name])
注意: 我們?cè)谶@里只是示范一下如何使用約束,而在實(shí)際的應(yīng)用程序中,用戶可能并不希望徹底限制姓名的性。
檢驗(yàn)性約束是一種新的強(qiáng)有力的SQL特性,它通過(guò)一個(gè)表達(dá)式從而允許用戶在表中添加數(shù)據(jù)合法性檢驗(yàn),該表達(dá)式可以指向一個(gè)單域,也可以指向跨越一個(gè)或多個(gè)表的多個(gè)域。比如用戶希望確定輸入到發(fā)票記錄中的數(shù)值是否總是大于0,則可以在ALTER TABLE語(yǔ)句的ADD CONSTRAINT子句中定義一個(gè)CHECK關(guān)鍵字。
ALTER TABLE tblInvoices
ADD CONSTRAINT CheckAmount
CHECK (Amount > 0)
注意: 檢驗(yàn)性約束語(yǔ)句只能通過(guò)Jet OLE DB provider和ADO來(lái)執(zhí)行,在Access SQL View的用戶界面中使用將返回錯(cuò)誤信息。而且,要?jiǎng)h除一個(gè)檢驗(yàn)性約束,也必須在Jet OLE DB provider 和ADO中執(zhí)行DROP CONSTRAINT語(yǔ)句。另外,如果用戶已經(jīng)定義了一個(gè)檢驗(yàn)性約束: (1) 在Access的用戶界面中并不會(huì)顯示為一個(gè)合法性規(guī)則,(2) 用戶也不能在該界面中定義合法性文本的屬性,否則將給出一般性錯(cuò)誤信息,(3) 在用戶通過(guò)ADO使用DROP CONSTRAINT語(yǔ)句之前,不能夠通過(guò)access的用戶界面或者在代碼中刪除數(shù)據(jù)表。
用來(lái)定義一個(gè)檢驗(yàn)性約束的表達(dá)式也可以用來(lái)指向同一個(gè)表中的多個(gè)域,甚至是其他表中的域。其中可以使用任何在Microsoft Jet SQL 中合法的操作符,比如SELECT 語(yǔ)句、數(shù)學(xué)運(yùn)算符、以及集合函數(shù)等。用來(lái)定義檢驗(yàn)性約束的表達(dá)式的長(zhǎng)度不能超過(guò)64個(gè)字符。
設(shè)想用戶希望在將顧客加入到Customers 表之前檢查每個(gè)顧客的信用額度。則可以使用帶有ADD COLUMN 和CONSTRAINT 子句的ALTER TABLE 語(yǔ)句生成一個(gè)約束,該約束將查找在CreditLimit表中的值來(lái)驗(yàn)證顧客的信用額度。下面的SQL語(yǔ)句將生成一個(gè)tblCreditLimit 表,然后將CustomerLimit域加入到tblCustomers 表中,并將檢驗(yàn)性約束加到tblCustomers表,最后對(duì)該檢驗(yàn)性約束進(jìn)行測(cè)試。
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語(yǔ)句時(shí),將被提示更新失敗,因?yàn)樵撜Z(yǔ)句違反了檢驗(yàn)性約束。如果用戶使用小于等于100的值來(lái)更新CustomerLimit域,就能夠成功。
在建立或倒入一個(gè)數(shù)據(jù)表之后,用戶可能需要修改表的設(shè)計(jì)。這時(shí)就可以使用ALTER TABLE語(yǔ)句。但是注意,改變現(xiàn)存的表的結(jié)構(gòu)可能會(huì)導(dǎo)致用戶丟失一些數(shù)據(jù)。比如,改變一個(gè)域的數(shù)據(jù)類型將導(dǎo)致數(shù)據(jù)丟失或舍入錯(cuò)誤,這取決于用戶現(xiàn)在使用的數(shù)據(jù)類型。改變數(shù)據(jù)表也可能會(huì)破壞用戶的應(yīng)用程序中涉及到所改變的域的部分。所以用戶在修改現(xiàn)有表的結(jié)構(gòu)之前一定要格外小心。
使用ALTER TABLE 語(yǔ)句,用戶可以增加,刪除或改變列或域,也可以增加或刪除一個(gè)約束。還可以為某個(gè)域設(shè)定缺省值,但是一次只能修改一個(gè)域。假設(shè)我們有一個(gè)記賬單的數(shù)據(jù)庫(kù),而我們想在顧客數(shù)據(jù)表中增加一個(gè)域,這時(shí)可以使用ALTER TABLE 語(yǔ)句,在其ADD COLUMN 子句后寫(xiě)上域的名稱、數(shù)據(jù)類型和數(shù)據(jù)的大?。ㄈ绻枰脑挘?BR> 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)建。刪除一個(gè)域要使用DROP COLUMN 子句,在其后跟上域的名稱。
ALTER TABLE tblCustomers
DROP COLUMN Address
注意使用這種方法將會(huì)刪除該域的現(xiàn)存數(shù)據(jù)。如果需要保存這些數(shù)據(jù),則用戶需要在access的用戶界面的設(shè)計(jì)模式中改變?cè)撚虻拿Q,或者編寫(xiě)代碼將現(xiàn)存的數(shù)據(jù)保存在一個(gè)臨時(shí)的表中然后將其添加到改名后的表中。
缺省值是指在表中增加新紀(jì)錄并且沒(méi)有為該列賦值時(shí)自動(dòng)填充到該域中的值。為某域設(shè)置缺省值,要在定義域的類型后使用使用DEFAULT關(guān)鍵字,不管是使用ADD COLUMN或 ALTER COLUMN 子句。
ALTER TABLE tblCustomers
ALTER COLUMN Address TEXT(40) DEFAULT Unknown
注意缺省值并不使用單引號(hào)包含,如果用了單引號(hào),則引號(hào)也會(huì)插入到記錄中。在CREATE TABLE語(yǔ)句中也可以使用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 語(yǔ)句只有在Jet OLE DB provider和ADO中可以執(zhí)行,在access SQL View的用戶界面中使用將會(huì)返回錯(cuò)誤信息。
下面的部分將討論如何在ALTER TABLE語(yǔ)句中使用約束。要獲得更詳細(xì)的有關(guān)ALTER TABLE的說(shuō)明,請(qǐng)?jiān)贠ffice 助手中或在Microsoft access 幫助的回答向?qū)У臉?biāo)簽頁(yè)中輸入ALTER TABLE ,然后單擊查找。
約束
在《access 2000的基礎(chǔ)Microsoft Jet SQL》一文中,我們討論了建立表之間的聯(lián)系的約束方法。約束也能用于建立主鍵和參考完整性,來(lái)限制插入到一個(gè)域中的數(shù)據(jù)值。通常,約束可以用于保持用戶數(shù)據(jù)庫(kù)中的數(shù)據(jù)完整性和一致性。
共有兩種類型的約束:?jiǎn)螖?shù)據(jù)域(或稱域級(jí)的)的約束和多數(shù)據(jù)域(或稱表級(jí)的)的約束。兩種約束都可以用在CREATE TABLE 或 ALTER TABLE 語(yǔ)句中。
單域的約束,也就是通常所說(shuō)的列級(jí)的約束,是在域及其數(shù)據(jù)類型定義后針對(duì)該域定義的。下面我們使用用戶表,在CustomerID域生成一個(gè)單域的主鍵。增加約束時(shí),在域名后使用CONSTRAINT關(guān)鍵字。
ALTER TABLE tblCustomers
ALTER COLUMN CustomerID INTEGER
CONSTRAINT PK_tblCustomers PRIMARY KEY
注意這里給出了約束的名稱。用戶還可以在定義主鍵時(shí)使用簡(jiǎn)稱而省略CONSTRAINT子句。
ALTER TABLE tblCustomers
ALTER COLUMN CustomerID INTEGER PRIMARY KEY
然而,使用簡(jiǎn)稱的方法將導(dǎo)致access隨機(jī)的生成約束的名稱,從而使得在代碼中難以引用。所以,給約束制定名稱。
要?jiǎng)h除一個(gè)約束,可以在ALTER TABLE 語(yǔ)句中使用DROP CONSTRAINT 子句,并給出約束的名稱。
ALTER TABLE tblCustomers
DROP CONSTRAINT PK_tblCustomers
約束還可以用來(lái)給域限制允許值。用戶可以將限制值設(shè)為非空(NOT NULL)或( UNIQUE),或者定義一個(gè)檢驗(yàn)性的約束,該約束指一種可以應(yīng)用于某個(gè)域的規(guī)則。比如用戶希望限制姓和名的域是的,就意味著在表中永遠(yuǎn)不會(huì)有兩個(gè)相同姓名的記錄存在。這是因?yàn)檫@種約束是多域的性的,是在表的級(jí)別定義的,而非域的級(jí)別。使用ADD CONSTRAINT子句可以定義一個(gè)多域的列表。
ALTER TABLE tblCustomers
ADD CONSTRAINT CustomerNames UNIQUE
([Last Name], [First Name])
注意: 我們?cè)谶@里只是示范一下如何使用約束,而在實(shí)際的應(yīng)用程序中,用戶可能并不希望徹底限制姓名的性。
檢驗(yàn)性約束是一種新的強(qiáng)有力的SQL特性,它通過(guò)一個(gè)表達(dá)式從而允許用戶在表中添加數(shù)據(jù)合法性檢驗(yàn),該表達(dá)式可以指向一個(gè)單域,也可以指向跨越一個(gè)或多個(gè)表的多個(gè)域。比如用戶希望確定輸入到發(fā)票記錄中的數(shù)值是否總是大于0,則可以在ALTER TABLE語(yǔ)句的ADD CONSTRAINT子句中定義一個(gè)CHECK關(guān)鍵字。
ALTER TABLE tblInvoices
ADD CONSTRAINT CheckAmount
CHECK (Amount > 0)
注意: 檢驗(yàn)性約束語(yǔ)句只能通過(guò)Jet OLE DB provider和ADO來(lái)執(zhí)行,在Access SQL View的用戶界面中使用將返回錯(cuò)誤信息。而且,要?jiǎng)h除一個(gè)檢驗(yàn)性約束,也必須在Jet OLE DB provider 和ADO中執(zhí)行DROP CONSTRAINT語(yǔ)句。另外,如果用戶已經(jīng)定義了一個(gè)檢驗(yàn)性約束: (1) 在Access的用戶界面中并不會(huì)顯示為一個(gè)合法性規(guī)則,(2) 用戶也不能在該界面中定義合法性文本的屬性,否則將給出一般性錯(cuò)誤信息,(3) 在用戶通過(guò)ADO使用DROP CONSTRAINT語(yǔ)句之前,不能夠通過(guò)access的用戶界面或者在代碼中刪除數(shù)據(jù)表。
用來(lái)定義一個(gè)檢驗(yàn)性約束的表達(dá)式也可以用來(lái)指向同一個(gè)表中的多個(gè)域,甚至是其他表中的域。其中可以使用任何在Microsoft Jet SQL 中合法的操作符,比如SELECT 語(yǔ)句、數(shù)學(xué)運(yùn)算符、以及集合函數(shù)等。用來(lái)定義檢驗(yàn)性約束的表達(dá)式的長(zhǎng)度不能超過(guò)64個(gè)字符。
設(shè)想用戶希望在將顧客加入到Customers 表之前檢查每個(gè)顧客的信用額度。則可以使用帶有ADD COLUMN 和CONSTRAINT 子句的ALTER TABLE 語(yǔ)句生成一個(gè)約束,該約束將查找在CreditLimit表中的值來(lái)驗(yàn)證顧客的信用額度。下面的SQL語(yǔ)句將生成一個(gè)tblCreditLimit 表,然后將CustomerLimit域加入到tblCustomers 表中,并將檢驗(yàn)性約束加到tblCustomers表,最后對(duì)該檢驗(yàn)性約束進(jìn)行測(cè)試。
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語(yǔ)句時(shí),將被提示更新失敗,因?yàn)樵撜Z(yǔ)句違反了檢驗(yàn)性約束。如果用戶使用小于等于100的值來(lái)更新CustomerLimit域,就能夠成功。

