熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL Server >> 正文

MS Jet SQL for Access 2000中級篇 (II)

2022-06-13   來源: SQL Server 

  改變數據表
  
  在建立或倒入一個數據表之後用戶可能需要修改表的設計這時就可以使用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
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.