达梦数据库—修改数据库表

语法格式

修改数据库表的 SQL 命令格式如下:

ALTER TABLE [模式名>.]表名> 修改表定义子句>

其中,修改表定义子句>简化格式如下:

MODIFY 字段定义>|

ADD [COLUMN] 字段定义>|

DROP [COLUMN] 字段名> [RESTRICT|CASCADE] |

ADD [CONSTRAINT [约束名>]] 表级约束定义> [选项>]|

DROP CONSTRAINT 约束名> [RESTRICT | CASCADE]

应用举例

【例 1】修改字段类型长度。以 SYSDBA 用户登录,将 PRODUCTION 模式的 PRODUCT_VIEW 表的 NAME 字段的数据类型改为 VARCHAR(30),并指定该列为 NOT NULL,且默认值为'刘青'。

SQL> ALTER TABLE production.product_review MODIFY name VARCHAR(30) NOT NULL 
DEFAULT '刘青' ; 

【例 2】修改字段类型长度。以 SYSDBA 用户登录,将 PRODUCTION 模式的 PRODUCT_VIEW 表的 NAME 字段的数据类型改为 VARCHAR(30),并指定该列为 NOT NULL,且默认值为'刘青'

SQL> ALTER TABLE production.product_review MODIFY name VARCHAR(30) NOT NULL 
DEFAULT '刘青' ; 

【例 3】增加普通字段。以 SYSDBA 用户登录,给 RESOURCES 模式的 EMPLOYEE_ADDRESS 表增加 USEDATE 字段,字段类型为 DATE。

SQL> ALTER TABLE resources.employee_address ADD usedate DATE;

【例 4】增加主键字段。以 SYSDBA 用户登录,给 RESOURCES 模式的 EMPLOYEE_ADDRESS 表增加 ID 字段,字段类型为 INT,且为主键字段。

SQL> ALTER TABLE resources.employee_address ADD id INT PRIMARY KEY; 
ALTER TABLE resources.employee_address ADD id INT PRIMARY KEY; 
[-6609]:违反列[ID]非空约束. 

该命令执行失败是由于 EMPLOYEE_ADDRESS 已经有数据记录,增加主键字段时, 由于主键字段为空,违反了实体完整性约束,所以增加主键字段不成功。 

【例 5】删除约束。以 SYSDBA 用户登录,删除 RESOURCES 模式的 EMPLOYEE_ ADDRESS 表的 NUM_CHECK 约束。

SQL> ALTER TABLE resources.employee_address DROP CONSTRAINT num_check;

【例 6】删除字段。以 SYSDBA 用户登录,删除 RESOURCES 模式的 EMPLOYEE_ ADDRESS 表的 NUM 字段。

SQL> ALTER TABLE resources.employee_address DROP num CASCADE;

附加说明

  1. 使用 MODIFY COLUMN 时,不能更改聚集索引的列或者引用约束中引用和被引 用的列。
  2. 使用 MODIFY COLUMN 时,一般不能更改用于 CHECK 约束的列。只有当该 CHECK 列都为字符串,且新列的长度大于旧列长度,或都为整型时,新列的类型才能够 完全覆盖旧列的类型(如 char(1)到 char(20),tinyint 到 int)时才能修改。
  3. 使用 MODIFY COLUMN 子句不能在列上增加 CHECK 约束,能修改的约束只有列 上的 NULL、NOT NULL 约束;如果某列现有的值均非空,则允许添加 NOT NULL;属于 聚集索引包含的列不能被修改;自增列不允许被修改
  4. 使用 MODIFY COLUMN 修改可更改列的数据类型时,若该表中无元组,则可任 意修改其数据类型、长度、精度或量度;若表中有元组,则系统会尝试修改其数据类型、 长度、精度或量度,如果修改不成功,则会报错返回。无论表中有无元组,多媒体数据类型和非多媒体数据类型都不能相互转换。
  5. 修改有默认值的列的数据类型时,原数据类型与新数据类型必须是可以转换的, 否则即使数据类型修改成功,在进行插入等其他操作时,仍会出现数据类型转换错误。
  6. 使用 ADD COLUMN 时,新增列名之间、新增列名与该基表中的其他列名之间均 不能重复。若新增列跟有默认值,则已存在的行的新增列值是其默认值。添加新列对于任 何涉及表的约束定义没有影响,对于涉及表的视图定义会自动增加。例如,如果用“*” 为一个表创建一个视图,那么后加入的新列会自动地加入该视图。
  7. 使用 ADD COLUMN 时,还有以下限制条件。 a. 列定义中如果带有列约束,只能是对该新增列的约束,但不支持引用约束;列级约 束可以带有约束名,系统中同一模式下的约束名不得重复,如果不带约束名,系统自动为 此约束命名。 b. 如果表上没有元组,列可以指定为 NOT NULL;如果表中有元组,对于已有列可 以指定同时有 DEFAULT 和 NOT NULL,新增列不能指定 NOT NULL。 c. 该列可指定为 CHECK。 d. 该列可指定为 FOREIGN KEY。 e. 允许向空数据的表中添加自增列。
  8. ADD CONSTRAINT 子句用于添加表级约束。表级约束包括:主键约束(PRIMARY KEY)、唯一性约束(UNIQUE)、引用约束(REFERENCES)、检查约束(CHECK)。添 加表级约束时可以带有约束名,系统中同一模式下的约束名不得重复,如果不带约束名, 系统自动为此约束命名;用 ADD CONSTRAINT 子句添加约束时,对于该基表上现有的全 部元组要进行约束违规验证。 a. 添加一个主键约束时,要求将成为关键字的字段上无重复值且值非空,并且表上没 有定义主关键字。 b. 添加一个 UNIQUE 约束时,要求将成为唯一性约束的字段上不存在重复值,但允 许有空值。 c. 添加一个 REFERENCES 约束时,要求将成为引用约束的字段上的值满足该引用 约束。 d. 添加一个 CHECK 约束或外键时,要求该基表中全部的元组满足该约束。
  9. 用 DROP COLUMN 子句删除一列有两种方式:RESTRICT 和 CASCADE。 RESTRICT 方式为默认选项,确保只有不被其他对象引用的列才被删除。无论哪种方式, 表中的唯一列不能被删除。RESTRICT 方式下,下列类型的列不能被删除:被引用列、建 有视图的列、有 CHECK 约束的列。删除列的同时将删除该列上的约束。CASCADE 方式 下,将删除这一列上的引用信息和被引用信息、引用该列的视图、索引和约束;系统允许 直接删除 PK 列。但被删除列为 CLUSTER PRIMARY KEY 类型时除外,此时不允许删除。
  10. DROP CONSTRAINT 子句用于删除表级约束,表级约束包括:主键约束(PRIMARY KEY)、唯一性约束(UNIQUE)、引用约束(REFERENCES)、检查约束(CHECK)。用 DROP CONSTRAINT 子句删除约束时,同样有 RESTRICT 和 CASCADE 两种方式。当删 除主键或唯一性约束时,系统自动创建的索引也将一起删除。如果打算删除一个主键约或一个唯一性约束而它有外部约束,除非指定 CASCADE 选项,否则将不允许删除。也就 是说,指定 CASCADE 时,删除的不仅仅是用户命名的约束,还有任何引用它的外部约束。
  11. 各个子句中都可以含有单个或多个列定义(约束定义),单个列定义(约束定义) 和多个列定义(约束定义)应该在它们的定义外加一层括号,括号要配对。
  12. 具有 DBA 权限的用户或该表的建表者才能执行此操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值