达梦数据库修改字段长度_达梦数据库修改字段(列)(基表
修改语句)
2019独⾓兽企业重⾦招聘Python⼯程师标准>>>
达梦数据库提供基表修改语句,对基表的结构进⾏全⾯的修改,包括修改基表名、列名、增加列、删除列、修改列类型、增加表级约束、删除表级约束、设置列缺省值、设置触发器状态等⼀系列修改。
通⽤格式:ALTER TABLE [[.] .]
下⾯通过例⼦来如何进⾏操作:根据实际情况对进⾏相应的变化
1.修改⼀列(字段)的数据类型、精度、刻度,设置列上的 DEFAULT,NOT NULL,NULL;
a. 使⽤ MODIFY COLUMN 时, 要更改的列不能是:
(1)聚集索引的列或者引⽤约束中引⽤和被引⽤的列; //(信息量⽐较⼤)
(2)⽤于 CHECK 约束的列。 //(信息量⽐较⼤)
b. 使⽤ MODIFY COLUMN ⼦句不能在列上增加 check 约束,能修改的约束只有列上的NULL, NOT NULL 约束; 如果某列现有的值均⾮空,则允许添加 NOT NULL; 属于聚集索引包含的列不能被修改; ⾃增列不允许被修改。
c. 使⽤ MODIFY COLUMN 修改可更改列的数据类型时,若该表中⽆元组(表中的⼀⾏称为元组,⽆元组即每⾏都没有数据),则可任意修改
其数据类型、长度、精度或量度;若表中有元组,则系统会尝试修改其数据类型、长度、精度或量度,如果修改不成功,则会报错返回。
特殊说明: ⽆论表中有、⽆元组,多媒体数据类型和⾮多媒体数据类型都不能相互转换。 d.修改有默认值的列的数据类型时, 原数据类型与新数据类型必须是可以转换的,否则即使数据类型修改成功,但在进⾏插⼊等其他操作时, 仍会出现数据类型转换错误。
举例说明:
例1 产品的评论表中COMMENTS、 PRODUCT_REVIEWID、 PRODUCTID、 RATING⼏列都不允许修改,分别因为: COMMENTS为多媒体数据类型; PRODUCT_REVIEWID上定义有关键字,属于⽤于索引的列; PRODUCTID⽤于引⽤约束(包括引⽤列和被引⽤列);RATING⽤于CHECK约束。另
外,关联有缺省值的列也不能修改。⽽其他列都允许修改。假定当前数据库为BOOKSHOP,⽤户为SYSDBA,如将评论⼈姓名的数据类型改为varchar(8),并指定该列为NOTNULL,且缺省值为'刘青':
ALTER TABLE PRODUCTION.PRODUCT_REVIEW MODIFY NAME varchar(8) DEFAULT '刘青' NOTNULL;
此语句只有在表中⽆元组的情况下才能成功。
2. 增加⼀列(字段)及该列(字段)上的列级约束;
a.使⽤ ADD COLUMN 时,新增列名之间、新增列名与该基表中的其它列名之间均不能重复。若新增列跟有缺省值,则已存在的⾏的新增列值是其缺省值。添加新列对于任何涉及表的视图定义或约束定义没有作⽤。例如: 如果⽤“*”为⼀个表创建⼀个视图,那么后加⼊的新列不会⾃动地加⼊视图中,只能重新创建此视图。
b.使⽤ ADD COLUMN 时,还有以下限制条件:
(1)列定义中如果带有列约束,只能是对该新增列的约束;列级约束可以带有约束名,系统中同⼀模式下的约束名不得重复,如果不带约束名,系统⾃动为此约束命名;
(2)如果表上没有元组,列可以指定为 NOT NULL;如果表中有元组,对于已有列可以指定同时有 DEFAULT 和 NOT NULL,新增列不能指定 NOT NULL(因为如果指定为not null那么之前存在的数据根本就没有这⼀列的数据,你还让它不能为空,是何居⼼?);
(3)该列可指定为 CHECK;
(4)该列可指定为 FOREIGN KEY;
(5) 允许向空数据的表中,添加⾃增列。
举例说明:
例2 具有DBA权限的⽤户需要对EMPLOYEE_ADDRESS表增加⼀列,列名为ID(序号),数据类型为INT,值⼩于10000。
ALTER TABLE RESOURCES.EMPLOYEE_ADDRESS ADD ID INT PRIMARY KEY CHECK (ID <10000);
如果该表上没有元组,且没有PRIMARY KEY,则可以将新增列指定为 PRIMARY KEY。表上没有元组时也可以将新增列指定为UNIQUE,但同⼀列上不能同时指定PRIMARY KEY和UNIQUE两种约束。
例3 具有DBA权限的⽤户需要对ADDRESS表增加⼀列, 列名为PERSONID,数据类型为INT,定义该列为NOT NULL,并引⽤PERSON 的PERSONID。
ALTER TABLE PERSON.ADDRESS ADD PERSONID INT NOT NULL REFERENCES PERSON. PERSON(PERSONID);
如果表上没有元组,新增列可以指定为 NOT NULL;如果表上有元组且都不为空,该列可以指定同时有 DEFAULT 和 NOT NULL,不能单独指定为 NOT NULL
3. 删除⼀列(字段);
⽤ DROP COLUMN ⼦句删除⼀列有两种⽅式: RESTRICT 和 CASCADE。 RESTRICT ⽅式为缺省选项,确保只有不被其他对象引⽤的列才被删除。⽆论哪种⽅式,表中的唯⼀列不能被删除。 RESTRICT ⽅式下,下列类型的列不能被删除:被引⽤列、建有视图的列、有check 约束的列。删除列的同时将删除该列上的约束。 CASCADE ⽅式下,将删除这⼀列上的引⽤信息和被引⽤信息、引⽤该列的视图、索引和约束;系统允许直接删除 PK 列(我猜pk列指的应该是主键列)。但被删除列为 CLUSTER PRIMARY KEY 类型时除外,此时不允许删除。(蓝⾊字没看懂)。
例 4 具有 DBA 权限的⽤户需要删除 PRODUCT 表的 PRODUCT_SUBCATEGORYID ⼀列。
ALTER TABLE PRODUCTION.PRODUCT DROP PRODUCT_SUBCATEGORYID CASCADE;
删除PRODUCT_SUBCATEGORYID这⼀列必须采⽤CASCADE⽅式,因为该列引⽤了PRODUCT_SUBCATEGORY表的
PRODUCT_SUBCATEGORYID。
4 . 表名或列表的重命名
举例说明:具有DBA权限的⽤户需要将表MY_STUDENT的SEX字段改为GENDER
ALTER TABLE DMHR.MY_STUDENT ALTER SEX RENAME TO GENDER;
/前4个是操作表的字段的,后⼏个是操作关于这个表的属性的*/
5. 增加表上的约束;
ADD CONSTRAINT ⼦句⽤于添加表级约束。表级约束包括:主键约束(PRIMARY KEY),唯⼀性约束(UNIQUE),引⽤约束(REFERENCES),检查约束(CHECK)。添加表级约束时可以带有约束名,系统中同⼀模式下的约束名不得重复,如果不带约束名,系统⾃动为此约束命名。⽤ ADD CONSTRAINT ⼦句添加约束时, 对于该基表上现有的全部元组要进⾏约束违规验证:
(1)添加⼀个主键约束时,要求将成为关键字的字段上⽆重复值且值⾮空,并且表上没有定义主关键字;
(2)添加⼀个 UNIQUE 约束时,要求将成为唯⼀性约束的字段上不存在重复值,但允许有空值;
(3)添加⼀个 REFERENCES 约束时,要求将成为引⽤约束的字段上的值满⾜该引⽤约束。
(4)添加⼀个 CHECK 约束或外键时,要求该基表中全部的元组满⾜该约束。
例5 具有DBA权限的⽤户需要在PRODUCT表上增加UNIQUE约束, UNIQUE字段为NAME。
ALTER TABLE PRODUCTION.PRODUCT ADD CONSTRAINT CONS_PRODUCTNAME UNIQUE(NAME);
⽤ADD CONSTRAINT⼦句添加约束时, 对于该基表上现有的全部元组要进⾏约束违规验证。
在这⾥,分为三种情况:
(1)如果表商场登记⾥没有元组,则上述语句⼀定执⾏成功;
(2)如果表商场登记⾥有元组,并且欲成为唯⼀性约束的字段商场名上不存在重复值,则
上述语句执⾏成功;
(3)如果表商场登记⾥有元组,并且欲成为唯⼀性约束的字段商场名上存在重复值,则上
述语句执⾏不成功,系统报错“⽆法建⽴唯⼀性索引”。
如果语句执⾏成功,⽤户通过查询
SELECT TABLEDEF('BOOKSHOP', 'PRODUCTION', 'PRODUCT');
可以看到,修改后的商场登记的表结构显⽰为:
CREATE TABLE "PRODUCT" AT "BOOKSHOP"
(
"PRODUCTID" INTEGER IDENTITY(1,1) NOT NULL,
"NAME" VARCHAR(50) NOT NULL,
"AUTHOR" VARCHAR(25) NOT NULL,
"PUBLISHER" VARCHAR(50) NOT NULL,
"PUBLISHTIME" DATE NOT NULL,
"PRODUCT_SUBCATEGORYID" INTEGER NOT NULL,
"PRODUCTNO" VARCHAR(25) NOT NULL,
"SATETYSTOCKLEVEL" SMALLINT NOT NULL,
"ORIGINALPRICE" DEC(19,4) NOT NULL,
"NOWPRICE" DEC(19,4) NOT NULL,
"DISCOUNT" DEC(2,1) NOT NULL,
"DESCRIPTION" TEXT,
"PHOTO" IMAGE,
"TYPE" VARCHAR(5),
"PAPERTOTAL" INTEGER,
"WORDTOTAL" INTEGER,
"SELLSTARTTIME" DATE NOT NULL,
"SELLENDTIME" DATE,
PRIMARY KEY("PRODUCTID"),
UNIQUE("PRODUCTNO"),
CONSTRAINT "CONS_PRODUCTNAME" UNIQUE("NAME"),
FOREIGN KEY("PRODUCT_SUBCATEGORYID")
REFERENCES"PRODUCT_SUBCATEGORY"("PRODUCT_SUBCATEGORYID"))
可以看到CONS_PRODUCTNAME就是UNIQUE约束名。创建唯一约束sql语句
6. 删除表上的约束;
DROP CONSTRAINT ⼦句⽤于删除表级约束,表级约束包括:主键约束(PRIMARY KEY)、
唯⼀性约束(UNIQUE)、引⽤约束(REFERENCES)、检查约束(CHECK)。⽤ DROP CONSTRAINT
⼦句删除⼀约束时, 同样有 RESTRICT 和 CASCADE 两种⽅式。 当删除主键或唯⼀性约束时,
系统⾃动创建的索引也将⼀起删除。 如果打算删除⼀个主键约束或⼀个唯⼀性约束⽽它有外部约
束,除⾮指定 CASCADE 选项,否则将不允许删除。也就是说,指定 CASCADE 时,删除的不
仅仅是⽤户命名的约束,还有任何引⽤它的外部约束。
例6 假定当前数据库为BOOKSHOP,库中具有DBA权限的⽤户需要删除PRODUCT表上的NAME的UNIQUE约束。当前的PRODUCT表结构请参见例5。删除表约束,⾸先需要得到该约束对应的约束名,⽤户可以查询系统表 SYSCONSTRAINTS,如下所⽰:
SELECT NAME FROM SYSCONSTRAINTS WHERE TABLEID =(SELECT ID FROM SYSTABLES WHERE NAME = 'PRODUCT' AND SCHID=( select SCHID from sysschemas where name='PRODUCTION'));
该系统表显⽰商场登记表上的所有PRIMARY KEY, UNIQUE, CHECK约束。查询得到NAME上UNIQUE约束对应的约束名,这⾥为CONS_PRODUCTNAME。然后,可采⽤以下的语句删除指定约束名的约束:
ALTER TABLE PRODUCTION.PRODUCT DROP CONSTRAINT CONS_PRODUCTNAME;
语句执⾏成功。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论