1. 求vfp中修改欄位長度語句
ALTER TABLE TableName1 ADD | ALTER [COLUMN] FieldName1
FieldType [( nFieldWidth [, nPrecision])] [NULL | NOT NULL] [CHECK lExpression1 [ERROR cMessageText1]]
[AUTOINC [NEXTVALUE NextValue [STEP StepValue]]] [DEFAULT eExpression1]
[primary key | UNIQUE [COLLATE cCollateSequence]]
[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 [ERRORcMessageText3]] [DROP CHECK]
[ADD primary key eExpression3 [FOR lExpression4] TAG TagName2
[, COLLATE cCollateSequence]] [DROP primary key]
[ADD UNIQUE eExpression4 [[FOR lExpression5] TAG TagName3
[ COLLATE cCollateSequence]]] [DROP UNIQUE TAG TagName4]
[ADD foreign key [eExpression5] [FOR lExpression6] TAG TagName4
[ COLLATE cCollateSequence] REFERENCES TableName2 [TAG TagName5]]
[DROP foreign key TAG TagName6 [SAVE]] [RENAME COLUMN FieldName4 TO FieldName5] [NOVALIDATE]
參數
ALTER TABLE TableName1
指定要修改其結構的表名。
ADD | ALTER [COLUMN] FieldName1
指定要添加的欄位名。
單個的表中最多可以有 255 個欄位。 如果一個或更多的欄位允許 null 值, 該限制為 254 個欄位。
FieldType [(nFieldWidth [, nPrecision])]
指定新欄位或待修改欄位的欄位類型、欄位寬度和欄位精度(小數點後的位數)。
參數 FieldType 是表示欄位數據類型的單個字元。有些欄位類型還需要參數 nFiledWidth 或 nPrecision,或者兩者皆要。下表列出了參數 FiledType 的值及其對應參數 nFiledWidth 和 nPression 的取捨情況: 欄位類型欄位寬度精度說明
Cn–寬度為 n 的字元欄位
D––日期
T––日期時間
Nnd寬度為 n 的數值型欄位,小數點後保留 d 位
Fnd寬度為 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 允許 null 值, NOT NULL 不允許 null 值。如果一個或更多的欄位允許 null 值, 表中可以包含的欄位從 255 減少到 254。
CHECK lExpression1
指定欄位的有效性規則。lExpression1 為邏輯表達式值,可以是用戶定義的函數或存儲過程。注意:每添加一個空記錄時,都將進行有效性檢查。
ERROR cMessageText1
指定欄位有效性檢查出現錯誤時顯示的錯誤信息。只有在「瀏覽」或「編輯」窗口中修改數據時,此信息才可能顯示。
AUTOINC [NEXTVALUE NextValue [STEP StepValue]]
啟用欄位的自動增量。NextValue 指定開始值並可以是范圍在 2,147,483,647 到 -2,147,483,647 的正的或負的整型值。默認值是 1。可以用表設計器中的欄位標簽中的 Next Value 微調來設置 NextValue。
StepValue 指定欄位的增量值並可以是范圍在 1 到 255 之間的正的, 非零的整型值。默認值是 1。 可以用表設計器中的欄位標簽中的 Step 微調來設置 StepValue。
Autoincrementing 值不能是 NULL。
DEFAULT eExpression1
指定欄位默認值。eExpression1 的數據類型必須與欄位的數據類型相同。
如果用 AUTOINC 子句來打開了一個欄位的 autoincrementing 就不能指定默認值。如果同時指定 AUTOINC 和 DEFAULT 子句 Visual FoxPro 會產生一個錯誤信息。
primary key | UNIQUE
primary key 創建主索引標識。索引標識與欄位同名。UNIQUE 創建與欄位同名的候選索引標識。有關候選索引的詳細內容,請參閱 設置主索引或候選索引。
COLLATE cCollateSequence
指定一個非默認設置 MACHINE 的比較序列。cCollateSequence 參數必須是一個可用的 Visual FoxPro 比較序列。關於設置比較序列的詳細信息, 參見 優化國際化應用程序 和 set collate 命令。
REFERENCES TableName2 [TAG TagName1]
指定與之建立永久關系的父表。
參數 TAG TagName1 指定父表索引標識,關系建立在此父表索引標識基礎上。索引標識最長為 10 個字。如果省略 TAG 子句, 關系用父表的主索引關鍵字建立。如果父表沒有主索引, Visual FoxPro 產生一條錯誤。
NOCPTRANS
防止對字元串或備注欄位進行代碼頁轉換。如果表轉換到另一代碼頁,指定了 NOCPTRANS 的欄位不進行轉換。NOCPTRANS 只能指定字元欄位和備注欄位。這會創建表設計器中的 Character (binary) 和 Memo (binary) 數據類型。
NOVALIDATE
選用這一選項後,Visual FoxPro 修改表的結構不受表中數據完整性的約束。默認時,Visual FoxPro 改變表結構將受到表中數據的完整性約束。使用 NOVALIDATE 參數將使默認情況無效。
ALTER [COLUMN] FieldName2
指定要修改的已有的欄位名。你需要在單個的 ALTER TABLE 命令中包括多個 ALTER COLUMN 子句來修改欄位的一個以上的屬性。關於 ALTER COLUMN 子句的結構的詳細信息, 參見本主題中的示例。
Set Default eExpression2
指定已有欄位的新默認值。eExpression2 的數據類型必須與欄位數據類型相同。
如果用 AUTOINC 子句來打開了一個欄位的 autoincrementing 就不能指定默認值。如果同時指定 AUTOINC 和 SET DEFAULT 子句 Visual FoxPro 會產生一個錯誤信息。
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 [FOR lExpression4] TAG TagName2
往表中添加主索引,eExpression 指定主索引關鍵字表達式。
可以用 lExpression4 來指定一個僅符合條件的記錄可以顯示和訪問的篩選表達式。主索引關鍵字是為匹配篩選條件的記錄而在索引文件中創建的。你應該避免使用 FOR 子句來創建主索引; 唯一性主鍵只強制匹配 FOR 子句中指定的條件的記錄。作為代替, 使用帶 FOR 子句的 INDEX 命令來創建篩選索引。
如果 lExpression4 表達式可以優化, Rushmore 查詢優化何以優化 ALTER TABLE ... FOR lExpression4 命令。為了更好的性能, 在 FOR 子句中使用可優化表達式。詳細信息, 參見 SET OPTIMIZE 和 用 Rushmore 查詢優化數據訪問速度。
TagName2 參數指定主索引標識的名字。索引標識名可以包含多至 10 個字元。如果省略 TAG TagName2, 而且 eExpression3 是一個單一的欄位, 主索引標識具有與 eExpression3 中指定的欄位相同的名字。
DROP primary key
刪除主索引及其標識。因為表只能有一個主關鍵字,所以不必指定關鍵字的名稱。刪除主索引也將刪除所有基於此關鍵字的永久關系。
ADD UNIQUE eExpression4 [TAG TagName3 [FOR lExpression5]]
往表中添加候選索引。eExpression4 指定候選索引關鍵字表達式,TagName3 指定候選索引標識名。候選標識名最長可為 10 個字元。如果省略參數 TAG TagName3 並且 eExpression4 為單個欄位,候選索引標識與 eExpression4 中的指定的欄位同名。
可以用 lExpression5 參數來指定一個只能顯示和訪問符合條件的篩選表達式。候選索引鍵是為匹配篩選條件的記錄而在索引文件中創建的。
如果 lExpression5 表達式可以被優化, Rushmore 可以優化 ALTER TABLE ... FOR lExpression5 命令。為了更好的性能, 在 FOR 子句中使用可優化表達式。詳細信息, 參見 SET OPTIMIZE 和 用 Rushmore 查詢優化數據訪問速度。
DROP UNIQUE TAG TagName4
刪除候選索引及其標識。因為表可能有多個候選關鍵字,所以必須指定候選索引標識名。
ADD foreign key [eExpression5] TAG TagName4 [FOR lExpression6]
往表中添加外部關鍵字(非主關字)索引。eExpression5 指定外部索引關鍵字表達式,TagName4 指定外部索引標識名。索引標識名最長為 10 個字元。
可以用 lExpression6 參數來指定一個只能顯示和訪問符合條件的記錄的篩選表達式。外部索引關鍵字是為匹配篩選條件的記錄而在索引文件中創建的。
如果 lExpression6 表達式可以被優化, Rushmore 可以優化 ALTER TABLE ... FOR lExpression6 命令。為了更好的性能, 在 FOR 子句中使用可優化表達式。詳細信息, 參見 SET OPTIMIZE 和 用 Rushmore 查詢優化數據訪問速度。
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 指定新的欄位名。
警告 改變表的欄位名時一定要小心--索引表達式、欄位和表的有效性規則、命令、函數等等可能仍會引用原始欄位名。
備注
ALTER TABLE 命令可以用於修改還沒有添加到資料庫中的表的結構。然而在修改自由表時,如果加入 DEFAULT、FOREIGN KEY、PRIMARY REFERENCES 或 SET 子句,Visual FoxPro 將出現錯誤。
ALTER TABLE 命令可以通過建立新表頭和往表頭中添加記錄來重建表。例如,改變欄位類型或欄位寬度。
表經過重建後,將對所有改變了類型或寬度的欄位執行欄位有效性規則。如果修改了表中所有欄位的類型或寬度,將執行表的有效性規則。
如果對已含有記錄的表修改其欄位有效規則或表有效性規則,Visual FoxPro 將檢查新的欄位或表有效性規則是否與存在數據相符合,並在發現有不符之處時發出警告。
如果打開了欄位的 autoincrementing 則不能在 DEFAULT 子句中指定值或表達式。
要移去 autoincrementing, 用 ALTER TABLE - SQL 來修改 COLUMN 來不包括 AUTOINC 子句。
Autoincrementing 欄位的欄位驗證將保持有效。你可能想用驗證來返回一個新的 autoincrementing 值。
當你想修改一個不包含 autoincrementing 欄位的表來包含 autoincrementing 欄位時, 無論是用 ALTER TABLE 命令或表設計器, autoincrementing 開始於下一個新添加的記錄上。表中已有的記錄不會從第一條記錄用 autoincrementing 值更新。你需要確保結果中不會有沖突發生。
在使用由 CREATE CURSOR 命令創建的 Visual FoxPro 游標時 ALTER TABLE 可能不產生一致的結果。特別是, 你可以創建一個有特點的 Visual FoxPro 游標, 如長欄位名, 這通常只在作為資料庫容器中的表中才可用。ALTER TABLE 保存一個游標的臨時拷貝, 因此適用於自由表的規則也適用, 而且任何要求資料庫支持的特點被丟失或修改不可預知的狀態。因此, 你通常應該避免在 Visual FoxPro 游標上使用 ALTER TABLE 除非你經過測試並知道結果。
如果省略 NULL 和 NOT NULL, 當前的 SET NULL 命令設置決定欄位是否允許 null 值。但是, 如果你省略 NULL 和 NOT NULL 但包括了 primary key 或 UNIQUE 子句, Visual FoxPro 忽略當前的 SET NULL 設置, 並且欄位默認為 NOT NULL。
如果 CHECK 子句中指定的有效性規則不允許在新添加的欄位中的空的欄位值, Visual FoxPro 產生一個錯誤。
在使用主索引和候選索引的欄位中不允許 null 值和重復記錄。但是, 如果你用 ADD COLUMN 創建一個支持 null 值的主索引或候選索引 Visual FoxPro 不產生錯誤。如果你試圖輸入一個 null 或重復值到使用主索引或候選索引的欄位中時 Visual FoxPro 產生一個錯誤。
注意 帶 UNIQUE 選項的 CREATE TABLE – SQL 或 ALTER TABLE – SQL 命令創建候選索引用 (提供它是為了和 ANSI 兼容), 與帶 UNIQUE 選項的 INDEX 命令創建的索引是不同的。用帶 UNIQUE 選項的 INDEX 命令創建的索引允許重復的索引關鍵字; 候選索引不允許重復的索引關鍵字。關於 INDEX 命令的 UNIQUE 選項的詳細信息, 參見 index 命令。
如果你修改一個已存在的欄位, 而且主索引表達式或候選索引表達式由表中的欄位組成, Visual FoxPro 檢查欄位是否包含 null 值或重復記錄。如果是, Visual FoxPro 產生記錄並且表不會被修改。
如果表被轉換到另一個代碼頁, 指定了 NOCPTRANS 的欄位不會被轉換。
示例
示例 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 索引標識。
示例 7 添加一個叫做 Fax2 的欄位到 Customer 表並防止欄位包含 null 值。顯示新的表結構。兩個 ALTER COLUMN 子句用於允許欄位有 null 值並設置欄位的默認值為 null 值。注意在單個 ALTER TABLE 命令中的多個 ALTER COLUMN 子句被要求來改變欄位的一個以上的屬性。然後從表中刪除新的欄位恢復表到原始狀態。
* 示例 1
SET PATH TO (HOME(2) + 'Data\') && Sets path to table.
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
* 示例 7
CLEAR
ALTER TABLE Customer ADD COLUMN Fax2 c(20) NOT NULL
DISPLAY STRUCTURE
ALTER TABLE Customer;
ALTER COLUMN Fax2 NULL;
ALTER COLUMN Fax2 SET DEFAULT .NULL.
ALTER TABLE Customer DROP COLUMN Fax2
下面示例使用 NOCPTRANS 來防止轉換到不同的代碼頁。示例創建一個名為 "mycursor" 的包含兩個字元型欄位和兩個備注欄位的臨時表。第二個字元型欄位 "char2" 和第二個備注欄位 "memo2" 包含了 NOCPTRANS 來防止轉換。
CREATE TABLE mytable (char1 C(10), char2 C(10) NOCPTRANS,;
memo1 M, memo2 M NOCPTRANS)