改變數據表 在建立或倒入一個數據表之後
用戶可能需要修改表的設計
這時就可以使用ALTER TABLE語句
但是注意
改變現存的表的結構可能會導致用戶丟失一些數據
比如
改變一個域的數據類型將導致數據丟失或捨入錯誤
這取決於用戶現在使用的數據類型
改變數據表也可能會破壞用戶的應用程序中涉及到所改變的域的部分
所以用戶在修改現有表的結構之前一定要格外小心
使用ALTER TABLE 語句
用戶可以增加
刪除或改變列或域
也可以增加或刪除一個約束
還可以為某個域設定缺省值
但是一次只能修改一個域
假設我們有一個記賬單的數據庫
而我們想在顧客數據表中增加一個域
這時可以使用ALTER TABLE 語句
在其ADD COLUMN 子句後寫上域的名稱
數據類型和數據的大小(如果需要的話)
ALTER TABLE tblCustomers
ADD COLUMN Address TEXT(
)
要改變域的數據類型或大小
可以使用ALTER COLUMN子句
在後面加上期望的數據類型和數據的大小
ALTER TABLE tblCustomers
ALTER COLUMN Address TEXT(
)
如果需要改變域的名稱
則必須刪除該域並重新創建
刪除一個域要使用DROP COLUMN 子句
在其後跟上域的名稱
ALTER TABLE tblCustomers
DROP COLUMN Address
注意使用這種方法將會刪除該域的現存數據
如果需要保存這些數據
則用戶需要在Access的用戶界面的設計模式中改變該域的名稱
或者編寫代碼將現存的數據保存在一個臨時的表中然後將其添加到改名後的表中
缺省值是指在表中增加新紀錄並且沒有為該列賦值時自動填充到該域中的值
為某域設置缺省值
要在定義域的類型後使用使用DEFAULT關鍵字
不管是使用ADD COLUMN或 ALTER COLUMN 子句
ALTER TABLE tblCustomers
ALTER COLUMN Address TEXT(
) DEFAULT Unknown
注意缺省值並不使用單引號包含
如果用了單引號
則引號也會插入到記錄中
在CREATE TABLE語句中也可以使用DEFAULT關鍵字
CREATE TABLE tblCustomers (
CustomerID INTEGER CONSTRAINT PK_tblCustomers
PRIMARY KEY
[Last Name] TEXT(
) NOT NULL
[First Name] TEXT(
) NOT NULL
Phone TEXT(
)
Email TEXT(
)
Address TEXT(
) DEFAULT Unknown)
注意
DEFAULT 語句只有在Jet OLE DB provider和ADO中可以執行
在Access SQL View的用戶界面中使用將會返回錯誤信息
下面的部分將討論如何在ALTER TABLE語句中使用約束
要獲得更詳細的有關ALTER TABLE的說明
請在Office 助手中或在Microsoft Access 幫助的回答向導的標簽頁中輸入ALTER TABLE
然後單擊查找
約束 在《Access
的基礎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特性
它通過一個表達式從而允許用戶在表中添加數據合法性檢驗
該表達式可以指向一個單域
也可以指向跨越一個或多個表的多個域
比如用戶希望確定輸入到發票記錄中的數值是否總是大於
則可以在ALTER TABLE語句的ADD CONSTRAINT子句中定義一個CHECK關鍵字
ALTER TABLE tblInvoices
ADD CONSTRAINT CheckAmount
CHECK (Amount >
)
注意
檢驗性約束語句只能通過Jet OLE DB provider和ADO來執行
在Access SQL View的用戶界面中使用將返回錯誤信息
而且
要刪除一個檢驗性約束
也必須在Jet OLE DB provider 和ADO中執行DROP CONSTRAINT語句
另外
如果用戶已經定義了一個檢驗性約束
(
) 在Access的用戶界面中並不會顯示為一個合法性規則
(
) 用戶也不能在該界面中定義合法性文本的屬性
否則將給出一般性錯誤信息
(
) 在用戶通過ADO使用DROP CONSTRAINT語句之前
不能夠通過Access的用戶界面或者在代碼中刪除數據表
用來定義一個檢驗性約束的表達式也可以用來指向同一個表中的多個域
甚至是其他表中的域
其中可以使用任何在Microsoft Jet SQL 中合法的操作符
比如SELECT 語句
數學運算符
以及集合函數等
用來定義檢驗性約束的表達式的長度不能超過
個字符
設想用戶希望在將顧客加入到Customers 表之前檢查每個顧客的信用額度
則可以使用帶有ADD COLUMN 和CONSTRAINT 子句的ALTER TABLE 語句生成一個約束
該約束將查找在CreditLimit表中的值來驗證顧客的信用額度
下面的SQL語句將生成一個tblCreditLimit 表
然後將CustomerLimit域加入到tblCustomers 表中
並將檢驗性約束加到tblCustomers表
最後對該檢驗性約束進行測試
CREATE TABLE tblCreditLimit (
Limit DOUBLE)
INSERT INTO tblCreditLimit
VALUES (
)
ALTER TABLE tblCustomers
ADD COLUMN CustomerLimit DOUBLE
ALTER TABLE tblCustomers
ADD CONSTRAINT LimitRule
CHECK (CustomerLimit <= (SELECT Limit
FROM tblCreditLimit))
UPDATE TABLE tblCustomers
SET CustomerLimit =
WHERE CustomerID =
注意
當用戶執行UPDATE TABLE語句時
將被提示更新失敗
因為該語句違反了檢驗性約束
如果用戶使用小於等於
的值來更新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語句
在記錄按序排列的數據庫應用中
快速外鍵也將發揮作用
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22105.html