MSJetSQLforAccess2000中級篇(II)

字號:

改變數(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ù)保存在一個臨時的表中然后將其添加到改名后的表中。
    缺省值是指在表中增加新紀錄并且沒有為該列賦值時自動填充到該域中的值。為某域設(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語句中使用約束。要獲得更詳細的有關(guān)ALTER TABLE的說明,請在Office 助手中或在Microsoft access 幫助的回答向?qū)У臉撕烅撝休斎階LTER 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ī)則。比如用戶希望限制姓和名的域是的,就意味著在表中永遠不會有兩個相同姓名的記錄存在。這是因為這種約束是多域的性的,是在表的級別定義的,而非域的級別。使用ADD CONSTRAINT子句可以定義一個多域的列表。
    ALTER TABLE tblCustomers
    ADD CONSTRAINT CustomerNames UNIQUE
    ([Last Name], [First Name])
    注意: 我們在這里只是示范一下如何使用約束,而在實際的應(yīng)用程序中,用戶可能并不希望徹底限制姓名的性。
    檢驗性約束是一種新的強有力的SQL特性,它通過一個表達式從而允許用戶在表中添加數(shù)據(jù)合法性檢驗,該表達式可以指向一個單域,也可以指向跨越一個或多個表的多個域。比如用戶希望確定輸入到發(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ù)表。
    用來定義一個檢驗性約束的表達式也可以用來指向同一個表中的多個域,甚至是其他表中的域。其中可以使用任何在Microsoft Jet SQL 中合法的操作符,比如SELECT 語句、數(shù)學(xué)運算符、以及集合函數(shù)等。用來定義檢驗性約束的表達式的長度不能超過64個字符。
    設(shè)想用戶希望在將顧客加入到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
    注意:當用戶執(zhí)行UPDATE TABLE語句時,將被提示更新失敗,因為該語句違反了檢驗性約束。如果用戶使用小于等于100的值來更新CustomerLimit域,就能夠成功。