ALTER TABLE – SQL 命令
以編程方式修改表的結構。
語法
ALTER TABLE TableName1
ADD | ALTER [COLUMN] FieldName1
FieldType [(nFieldWidth [, nPrecision])]
[NULL | NOT NULL]
[CHECK lExpression1 [ERROR cMessageText1]]
[DEFAULT eExpression1]
[PRIMARY KEY | UNIQUE]
[REFERENCES TableName2 [TAG TagName1]]
[NOCPTRANS]
[NOVALIDATE]
— 或者 —
ALTER TABLE TableName1
ALTER [COLUMN] FieldName2
[NULL | NOT NULL]
[SET DEFAULT eExpression2]
[SET CHECK lExpression2 [ERROR cMessageText2]]
[DROP DEFAULT]
[DROP CHECK]
[NOVALIDATE]
— 或者 —
ALTER TABLE TableName1
[DROP [COLUMN] FieldName3]
[SET CHECK lExpression3 [ERROR cMessageText3]]
[DROP CHECK]
[ADD PRIMARY KEY eExpression3 TAG TagName2 [FOR lExpression4]]
[DROP PRIMARY KEY]
[ADD UNIQUE eExpression4 [TAG TagName3 [FOR lExpression5]]]
[DROP UNIQUE TAG TagName4]
[ADD FOREIGN KEY [eExpression5] TAG TagName4 [FOR lExpression6]
REFERENCES TableName2 [TAG TagName5]]
[DROP FOREIGN KEY TAG TagName6 [SAVE]]
[RENAME COLUMN FieldName4 TO FieldName5]
[NOVALIDATE]
參數
TableName1
指定要修改其結構的表名。
ADD [COLUMN] FieldName1
指定要添加的欄位名。單個的表中最多可以有 255 個欄位。 如果一個或更多的欄位允許 null 值, 該限制為 254 個欄位。
ALTER [COLUMN] FieldName1
指定要修改的已有的欄位名。
FieldType [(nFieldWidth [, nPrecision])]
指定新欄位或待修改欄位的欄位類型、欄位寬度和欄位精度(小數點後的位數)。
參數 FieldType 是表示欄位數據類型的單個字元。有些欄位類型還需要參數 nFiledWidth 或 nPrecision,或者兩者皆要。
下表列出了參數 FiledType 的值及其對應參數 nFiledWidth 和 nPression 的取捨情況:
欄位類型 欄位寬度 精度 說明
C n – 寬度為 n 的字元欄位
D – – 日期
T – – 日期時間
N n d 寬度為 n 的數值型欄位,小數點後保留 d 位
F n d 寬度為 n 的浮點型欄位,小數點後保留 d 位
I – – 整數型
B – d 雙精度型
Y – – 貨幣型
L – – 邏輯型
M – – 備註型
G – – 通用型
P – – 圖象
對於 D、T、I、Y、L、M、G 和 P 型數據,省略參數 nFieldWidth 和 nPrecision。如果對 N、F 或 B 型數據沒有給出參數 nPrecision 的值,其的默認值為零。
NULL | NOT NULL
允許或不允許欄位為空值。
如果省略 NULL 和 NOT NULL,當前的 SET NULL 設定將決定欄位是否允許為空;並且如果命令中帶有 PRIMARY KEY 或 UNIQUE 子句,當前的 SET NULL 設定不起作用,欄位默認狀況為非空。
CHECK lExpression1
指定欄位的有效性規則。lExpression1 為邏輯表達式值,可以是用戶定義的函式或存儲過程。注意:每添加一個空記錄時,都將進行有效性檢查。如果有效性規則不允許添加的記錄中有空欄位值,VisualFoxPro 將產生錯誤信息。
ERROR cMessageText1
指定欄位有效性檢查出現錯誤時顯示的錯誤信息。只有在“瀏覽”或“編輯”視窗中修改數據時,此信息才可能顯示。
DEFAULT eExpression1
指定欄位默認值。eExpression1 的數據類型必須與欄位的數據類型相同。
PRIMARY KEY
創建主索引標識。索引標識與欄位同名。
UNIQUE
創建與欄位同名的候選索引標識。有關候選索引的詳細內容,請參閱《開發指南》的第七章“處理表”。
附註
候選索引(由 UNIQUE 選項創建,具有在 ALTER TABLE 或 CREATE TABLE 中的 ANSI 兼容性。)與帶 UNIQUE 選項的 INDEX 命令創建的索引不同。用帶 UNIQUE 選項的 INDEX 命令創建的索引允許有重複索引關鍵字,而候選索引不允許有重複索引關鍵字。
在主索引或候選索引欄位中,不允許有空值和重複記錄。
如果用 ADD COLUMN 子句創建一個新欄位,若給允許空值的欄位創建主索引或候選索引,VisualFoxPro 不會產生錯誤。但是,如果您試圖往用作主索引或候選索引的欄位中輸入空值或重複值,VisualFoxPro 將產生錯誤信息。
如果修改已有的欄位和由欄位組成的主索引表達式或候選表達式時,將檢查欄位是否為空值或重複記錄。如果為空值或重複記錄,Visual FoxPro 將產生錯誤,並且不對表進行修改。
REFERENCES TableName2 TAG TagName1
指定與之建立永久關係的父表。參數 TAG TagName1 指定父表索引標識,關係建立在此父表索引標識基礎上。索引標識最長為 10 個字。
NOCPTRANS
防止對字元串或備註欄位進行代碼頁轉換。如果錶轉換到另一代碼頁,指定了 NOCPTRANS 的欄位不進行轉換。NOCPTRANS 只能指定字元欄位和備註欄位。
下面的例子建立了一個名字為 MYTABLE 的表:該表包括兩個字元欄位和兩個備註欄位。第二個字元欄位 char2 和第二個備註欄位 memo2 包含 NOCPTRANS 以防止轉換。
CREATE TABLE mytable (char1 C(10), char2 C(10) NOCPTRANS,;
memo1 M, memo2 M NOCPTRANS)
ALTER [COLUMN] FieldName2
指定要修改的已有的欄位名。
SET DEFAULT eExpression2
指定已有欄位的新默認值。eExpression2 的數據類型必須與欄位數據類型相同。
SET CHECK lExpression2
指字已有欄位新的有效性規則。lExpression2 值必須為邏輯表達式,也可以為用戶自定義函式或已有的過程。
ERROR cMessageText2
指定有效性檢查出現錯誤時顯示的錯誤信息。只有在“瀏覽”視窗或“編輯”視窗改變數據時,才可能顯示此信息。
DROP DEFAULT
刪除已有欄位的默認值。
DROP CHECK
刪除已有欄位的有效性規則。
DROP [COLUMN] FieldName3
從表中刪除一個欄位。刪除一個欄位的同時也刪除了欄位的默認值和欄位有效性規則。
欄位被刪除後,索引關鍵字或引用此欄位的觸發器表達式將變為無效。在這種情況下,刪除欄位並不產生錯誤,但是在運行時刻,無效的索引關鍵字或觸發器表達式將導致錯誤。
SET CHECK lExpression3
指定表的有效性規則。lExpression3 必須是邏輯表達式,也可以是用戶自定義函式或已有的過程。
ERROR cMessageText3
指定表的有效性檢查出現錯誤時顯示的錯誤信息。只有在“瀏覽”視窗或“編輯”視窗中改變數據值時,才可能顯示此信息。
DROP CHECK
刪除表的有效性規則。
ADD PRIMARY KEY eExpression3 TAG TagName2
往表中添加主索引,eExpression 指定主索引關鍵字表達式,TagName2 指定主索引標識名,索引標識名最長為 10 個字元。如果省略TAG TagName2 而 eExpression3 是一個欄位,主關鍵索引標識與指定的 eExpression3 同名。
DROP PRIMARY KEY
刪除主索引及其標識。因為表只能有一個主關鍵字,所以不必指定關鍵字的名稱。刪除主索引也將刪除所有基於此關鍵字的永久關係。
ADD UNIQUE eExpression4 [TAG TagName3]
往表中添加候選索引。eExpression4 指定候選索引關鍵字表達式,TagName3 指定候選索引標識名。候選標識名最長可為 10 個字元。如果省略參數 TAG TagName3 並且 eExpression4 為單個欄位,候選索引標識與 eExpression4 中的指定的欄位同名。
DROP UNIQUE TAG TagName4
刪除候選索引及其標識。因為表可能有多個候選關鍵字,所以必須指定候選索引標識名。
ADD FOREIGN KEY [eExpression5] TAG TagName4
往表中添加外部關鍵字(非主關字)索引。
eExpression5 指定外部索引關鍵字表達式,TagName4 指定外部索引標識名。索引標識名最長為 10 個字元。
REFERENCES TableName2 [TAG TagName5]
指定在其上創建了永久關係的父表。使用 TAG TagName5 指定一個已有的索引標識,基於此索引標識建立表與父表的一個關係。索引標識名最長可以為 10 個字元。如果省略參數 TAG TagName5,則使用父表的主索引標識建立關係。
DROP FOREIGN KEY TAG TagName6 [SAVE]
刪除索引標識為 TagName6 的外部關鍵字。如果省略 SAVE 參數,將從結構索引中刪除索引標識。如果加入 SAVE 參數,則不從結構索引中刪除索引標識。
RENAME COLUMN FieldName4 TO FieldName5
允許改變表中欄位的欄位名。FieldName4 指定待更改的欄位名,FieldName5 指定新的欄位名。
注意
改變表的欄位名時一定要小心--索引表達式、欄位和表的有效性規則、命令、函式等等可能仍會引用原始欄位名。
NOVALIDATE
選用這一選項後,Visual FoxPro 修改表的結構不受表中數據完整性的約束。默認時,Visual FoxPro 改變表結構將受到表中數據的完整性約束。使用 NOVALIDATE 參數將使默認情況無效。
說明
ALTER TABLE 命令可以用於修改還沒有添加到資料庫中的表的結構。然而在修改自由表時,如果加入 DEFAULT、FOREIGN KEY、PRIMARY REFERENCES 或 SET 子句,Visual FoxPro 將出現錯誤。
ALTER TABLE 命令可以通過建立新表頭和往表頭中添加記錄來重建表。例如,改變欄位類型或欄位寬度。
表經過重建後,將對所有改變了類型或寬度的欄位執行欄位有效性規則。如果修改了表中所有欄位的類型或寬度,將執行表的有效性規則。
如果對已含有記錄的表修改其欄位有效規則或表有效性規則,Visual FoxPro 將檢查新的欄位或表有效性規則是否與存在數據相符合,並在發現有不符之處時發出警告。
如果要修改的表在資料庫中,ALTER TABLE-SQL 命令需要獨占使用資料庫。若要獨占打開資料庫,可使用包含 EXCLUSIVE 子句的 OPEN DATABASE 命令。
alter table – sql 命令示例
示例 1 往表 customer 中添加欄位 fax, 並且允許欄位有空值。
示例 2 使 cust_id 欄位為 customer 表的主關鍵字。
示例 3 給 orders 表中的 quantity 欄位添加有效性規則,使欄位 quantity 的值非負。
示例 4 基於表 customer 的關鍵字 cust_id和表 orders 中的候選關鍵字 cust_id,建立 customer 和 orders 間的一對多永久關係。
示例 5 刪除表 orders 的 quantity 欄位的有效性規則。
示例 6 刪除表 customer 和表 orders 間的永久關係,但保持 orders 表中的 cust_id 索引標識。
*示例 1
set path to (home( ) + 'samples\data\')
&& 為表設定路徑
alter table customer add column fax c(20) null
*示例 2
alter table customer add primary key cust_id tag cust_id
alter table customer alter column cust_id c(5) primary key
*示例 3
alter table orders;
alter column quantity set check quantity >= 0;
error "quantities must be non-negative"
*示例 4
alter table orders;
add foreign key cust_id tag cust_id references customer
*示例 5
alter table orders alter column quantity drop check
*示例 6
alter table orders drop foreign key tag cust_id save