ALTER TABLE-SQL 命 令
以编程方式修改表的结构
语 法
ALTER TABLE TableName1
A D D | ALTER [COLUMN] FieldName1
FieldType [( nField W idth [, nPrecision ])] [NULL | NOT NULL]
[CHECK lExpression1 [ERROR cMessageText1 ]] [DEFAULT eExpression1 ]
[PRIMARY KEY | UNIQUE]
[REFERENCES TableName2 [TAG TagName1 ]] [NOCPTRANS]
– 或 者 –
ALTER TABLE TableName1
ALTER [COLUMN] FieldName2
[NULL | NOT NULL]
[SET DEFAULT eExpression2 ]
[SET CHECK lExpression2 [ERROR cMessageText2 ]] [DROP DEFAULT]
[DROP CHECK]
– 或 者 –
ALTER TABLE TableName1
[DROP [COLUMN] FieldName3 ]
[SET CHECK lExpression3 [ERROR cMessageText3 ]] [DROP CHECK]
[ADD PRIMARY KEY eExpression3 T A G TagName2 [FOR
lExpression4 ]]
[DROP PRIMARY K EY]
[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 个 字 段 如 果 一 或 多 个 字 段 允 许空 值 则 最 多 可 含 254 个 字 段
ALTER [COLUMN] FieldName1
指 定 要 修 改 的 字 段 名 字 段 已 存 在
FieldType [( nField W idth [, nPrecision ])]
指 定 新 字 段 或 待 修 改 字 段 的 字 段 类 型 字 段 宽 度 和 字 段 精 度 小 数 点 后 的 位数
参 数 FieldType 是 表 示 字 段 数 据 类 型 的 单 个 字 符 有 些 字 段 类 型 还 需 要 参 数
nFiledWidth 或 nPrecision 或 者 两 者 皆 要
下 表 列 出 了 参 数 FiledType 的 值 及 其 对 应 参 数 nFiledWidth 和 nPression 的 取舍 情 况
字 段 类 型 字 段 宽 度 精 度 说 明
C |
n |
– 宽 度 为 n 的 字 符 字 段 |
---|---|---|
D |
– |
– 日 期 |
T |
– |
– 日 期 时 间 |
N |
n |
d |
宽 度 为 |
n |
的 |
数 | 值 | 型 | 字 |
段 |
小 | 数 | 点 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
F |
n |
d |
后 保 留 宽 度 为 |
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 的值 其默认值为 0
NULL | NOT NULL
允 许 或 不 允 许 字 段 为 null 值 如 果 一 个 或 更 多 的 字 段 可 以 包 含 .null.值那 么 表 拥 有 的 最 多 的 字 段 数 将 减 少 一 个 从 255 降 到 254
如果省略 NULL 和 NOT NULL 当前的 SET NULL 设置将决定字段是否允许为 null
并且如果命令中带有 PRIMARY KEY 或 UNIQUE 子句 当前的 SET NULL 设置不起作用 字段默认为非 null
CHECK lExpression1
指 定 字 段 的 有 效 性 规 则 lExpression1 为 逻 辑 表 达 式 值 可 以 是 用 户 定 义 的函 数 或 内 部 存 储 过 程 注 意 每 添 加 一 个 空 记 录 时 都 将 进 行 有 效 性 检 查如 果 有 效 性 规 则 不 允 许 添 加 的 记 录 中 有 空 字 段 值 V isual FoxPro 将 产 生 错 误信 息
ERROR cMessageText1
指 定 字 段 有 效 性 检 查 出 现 错 误 时 显 示 的 错 误 信 息 只 有 在 浏 览 或 编 辑 窗 口 中修 改 数 据 时 此 信 息 才 可 能 显 示
DEFAULT eExpression1
指 定 字 段 默 认 值 eExpression1 的 数 据 类 型 必 须 与 字 段 的 数 据 类 型 相 同
PRIMARY KEY
创 建 主 索 引 标 识 索 引 标 识 与 字 段 同 名
UNIQUE
创 建 与 字 段 同 名 的 候 选 索 引 标 识
有关候选索引标识的更多信息 请参阅 Microsoft Visual FoxPro 6.0 中文版程序员指南 第 七章 表的操作
注 意 候 选 索 引 由 UNIQUE 选 项 创 建 具 有 在 ALTER TABLE 或 CREATE
TABLE 中 的 ANSI 兼 容 性 与 带 UNIQUE 选 项 的 INDEX 命 令 创 建 的索 引 不 同 用 带 UNIQUE 选 项 的 INDEX 命 令 创 建 的 索 引 允 许 有 重 复 索 引关 键 字 而 候 选 索 引 不 允 许 有 重 复 索 引 关 键 字
在主索引或候选索引字段中 不允许有 null 值和重复记录
如果用 ADD COLUMN 子句创建一个新字段 若给允许 null 值的字段创建主索引或候选索引 Microsoft Visual FoxPro 不会产生错误 但 是 如果您试图往用作主索引或候选索引的字段中输入 null 值或重复值 Visual FoxPro 将产生错误信息
如果修改已有的字段和由字段组成的主索引表达式或候选表达式时 将检查字段是否为 null 值或重复记录 如果为 null 值或重复记录 Visual FoxPro 将产生错误 并 且 不对表进行修改
REFERENCES TableName2 T A G TagName1
指 定 与 之 建 立 永 久 关 系 的 父 表 参 数 T A G TagName1 指 定 父 表 索 引 标 识 关系 建 立 在 此 父 表 索 引 标 识 基 础 上 索 引 标 识 最 长 为 10 个 字
NOCPTRANS
防 止 对 字 符 串 或 备 注 字 段 进 行 代 码 页 转 换 如 果 需 要 将 表 转 换 到 另 一 代 码页 那 么 指 定 了 NOCPTRANS 的 字 段 不 进 行 转 换 只 能 对 字 符 字 段 和 备 注字 段 指 定 NOCPTRANS
下面的示例创建一个包含两个字符型字段和两个备注型字段 名称为 MYTABLE 的
表 第 2 个字符型字段 char2 与第 2 个备注型字段 memo 2 包括了 NOCPTRANS 以避免翻译
CREATE TABLE mytable (char1 C(10), char2 C(10) NOCPTRANS,;
memo1 M, memo2 M NOCPTRANS)
ALTER [COLUMN] FieldName2
指 定 要 修 改 的 已 有 的 字 段 名 注 意 在 单 独 的 ALTER TABLE 命 令 中 更 改 字 段一 个 以 上 的 属 性 时 需 要 多 个 A L T E R C O L U M N 子 句 请 参 阅 ALTER TABLE 示 例 了 解 A L T E R C O L U M N 子 句 是 如 何 构 造 的
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 T A G TagName2 [FOR lExpression4 ] 往表中添加主索引 eExpression 指定主索引关键字表达式 TagName2 指定主索引标识名 索引标识名最长为 10 个字符 如果省略 TAG TagName2 而 eExpression3 是一个字段 主关键索引标识与指定的 eExpression3 同名
包含 FOR lExpression4 子句 可以指定只有满足筛选表达式 lExpression4 的记录才可以显示和访问 主索引关键字是在所有文件中只为符合这个筛选表达式的记录创建的 注意 应该避免使用 FOR 子句创建一个主索引 主索引关键字的唯一性只限制
满足筛选表达式 lExpression4 的记录 相反 应该使用带 FOR 子句的 INDEX 命令创建一个筛选索引
如果 lExpression4 是一个可优化的表达式 则 Rushmore 技术优化这个 ALTER
TABLE ... FOR lExpression4 命令 为了得到最好的性能 可在 FOR 子句中使用一个可优化的表达式
详细内容 请参阅 Microsoft Visual FoxPro 6.0 中文版程序员指南 第 十五章 优化应用程序
DROP PRIMARY KEY
删 除 主 索 引 及 其 标 识 因 为 表 只 能 有 一 个 主 关 键 字 所 以 不 必 指 定 关 键 字 的名 称 删 除 主 索 引 也 将 删 除 所 有 基 于 此 关 键 字 的 永 久 关 系
ADD UNIQUE eExpression4 [TAG TagName3 [FOR lExpression5 ]]
往表中添加候选索引 eExpression4 指定候选索引关键字表达式 TagName3 指定候选索引标识名 候选标识名最长可为 10 个字符 如果省略参数 TAG TagName3 并且eExpression4 为单个字段 候选索引标识与 eExpression4 中的指定的字段同名
包含 FOR lExpression 5 子句 可以指定只有满足筛选表达式 lExpression 5 的记录才可以显示和访问 候选索引关键字是在所有文件中只为符合这个筛选表达式的记录创建的
如果 lExpression 5 是一个可优化的表达式 则 Rushmore 技术优化这个 ALTER
TABLE ... FOR lExpression 5 命令 为了得到最好的性能 可在 FOR 子句中使用一个可优化的表达式
详细内容 请参阅 Microsoft Visual FoxPro 6.0 中文版程序员指南 第 十五章 优化应
用程序
DROP UNIQUE TAG TagName4
删 除 候 选 索 引 及 其 标 识 因 为 表 可 能 有 多 个 候 选 关 键 字 所 以 必 须 指 定 候 选索 引 标 识 名
ADD FOREIGN KEY [ eExpression5 ] TAG TagName4 [FOR lExpression6 ] 往表中添加外部关键字 非主关键字 索 引 eExpression5 指定外部索引关键字表达式 TagName4 指定外部索引标识名 索引标识名最长为 10 个字符
包含 FOR lExpression 6 子句 可以指定只有满足筛选表达式 lExpression 6 的记录
才可以显示和访问 外部索引关键字是在所有文件中只为符合这个筛选表达式的记录创建的
如果 lExpression 6 是一个可优化的表达式 则 Rushmore 技 术 优 化 这 个 ALTER TABLE ... FOR lExpression 6 命令 为了得到最好的性能 可在 FOR 子句中使用一个可优化的表达式
详细内容 请参阅 Microsoft Visual FoxPro 6.0 中文版程序员指南 第 十五章 优化应用程序
REFERENCES TableName2 [TAG TagName5 ]
指 定 在 其 上 创 建 了 永 久 关 系 的 父 表 使 用 T A G TagName5 指 定 一 个 已 有 的 索引 标 识 基 于 此 索 引 标 识 建 立 表 与 父 表 的 一 个 关 系 索 引 标 识 名 最 长 可 以 为10 个 字 符 如 果 省 略 参 数 T A G TagName5 则 使 用 父 表 的 主 索 引 标 识 建 立 关系
DROP FOREIGN KEY TAG TagName6 [SAVE]
删 除 索 引 标 识 为 TagName6 的 外 部 关 键 字 如 果 省 略 SAVE 参 数 将 从 结 构索 引 中 删 除 索 引 标 识 如 果 加 入 SAVE 参 数 则 不 从 结 构 索 引 中 删 除 索 引 标识
R E N A M E C O L U M N FieldName4 TO FieldName5
允 许 改 变 表 中 字 段 的 字 段 名 FieldName4 指 定 待 更 改 的 字 段 名 FieldName5
指 定 新 的 字 段 名
警 告 改 变 表 的 字 段 名 时 一 定 要 小 心 索 引 表 达 式 字 段 和 表 的 有 效 性 规 则命 令 函 数 等 等 可 能 仍 会 引 用 原 始 字 段 名
NOVALIDATE
选 用 这 一 选 项 后 V isual FoxPro 修 改 表 的 结 构 不 受 表 中 数 据 完 整 性 的 约 束默 认 时 V isual FoxPro 改 变 表 结 构 将 受 到 表 中 数 据 的 完 整 性 约 束 使 用NOVALIDATE 参 数 将 使 默 认 情 况 无 效
说 明
ALTER TABLE 命令可以用于修改还没有添加到数据库中的表的结构 然而在修改自由表时 如果加入 DEFAULT FOREIGN KEY PRIMARY REFERENCES 或 SET 子
句 Visual FoxPro 将出现错误
ALTER TABLE 命令可以通过建立新表头和往表头中添加记录来重建表 例如 改变字段类型或字段宽度
表经过重建后 将对所有改变了类型或宽度的字段执行字段有效性规则 如果修改了表中所有字段的类型或宽度 将执行表的有效性规则
如果对已含有记录的表修改其字段有效规则或表有效性规则 Visual FoxPro 将检查新的字段或表有效性规则是否与存在数据相符合 并在发现有不符之处时发出警告 如果要修改的表在数据库中 ALTER TABLE-SQL 命令需要独占使用数据库 若要独占打开数据库 可使用包含 EXCLUSIVE 子句的 OPEN DATABASE 命令
示 例
示例 1 往表 customer 中添加字段 fax 并且允许字段有 null 值示例 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\') && 为表设置路径
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
请 参 阅
CREATE TABLE-SQL , INDEX , MODIFY STRUCTURE , OPEN DATABASE