db2 alter 以及 db2 constraint

 

--以下语句都是在db2中运行的结果,其他的数据库不保证正确。

DROP TABLE DQ;

DROP TABLE STU;

 

create table dq (dqno int,dqname char(10));

--建表时不指定任何约束。

insert into dq values (1,'beijing');

insert into dq values (2,'shanghai');

insert into dq values (3,'hangzhou');

     --插入三条记录。

select * from dq;

 

现在想制定dqno为dq表的主键:

由于db2在指定成为主键前必须要有非空限制,所以先添加非空约束。

alter table dq add constraint CK_SQ1 CHECK(dqno is not null);

     --添加非空约束

insert into dq(dqname) values ('tianjin');

--测试约束是否生效,报错“The requested operation is not allowed because

--a row does not satisfy the check constraint "DB2ADMIN.DQ.CK_SQ1"”。

--证明约束已经生效。

alter table dq add constraint CST_DQ primary key (DQNO);

--添加主键约束。报错:“"DQNO" cannot be a column of a primary key or unique ---key because it can contain null values”???还报错?

--因为db2不识别这样的not null,我们可以drop约束然后使用另一种。

ALTER TABLE DQ drop check CK_SQ1;

--删除约束CK_SQ1

alter table dq alter dqno set not null;

--设置dqno字段的非空属性

reorg table dq;

--db2做过alter以后最好都reorg以下,否则总是容易导致表处于挂起状态而无法进行其--他操作。

alter table dq add constraint CST_DQ primary key (DQNO);

--添加主键约束。

 

 

create table STU

(id int not null primary key,

 sex  char(1) check(sex in ('F','M')),

 name char(20)  default 'no name',

 region int,

 foreign key(region) references dq(dqno)

 ); ---建表时即指定一大堆约束。

 INSERT INTO stu  VALUES (1,'F',NULL,1);

 INSERT INTO stu  VALUES (2,'M',NULL,2);

SELECT * FROM stu;

 

--可以发现name字段插入的都为空,也就是说不是'no name',为什么?

--继续下边:

 INSERT INTO stu(ID,SEX,REGION)  VALUES (3,'M',3);

 SELECT * FROM stu;

 

--可以发现3已经激发默认值了。也就是说如果你向这个字段写入了,不管是null,还是非null,都代表你指定了name字段的值,此时default就不激发。只有当你insert 数据的时候没有指定name字段,此时才激发默认,写入”no name”。

 

--现在把建表时指定的一大堆约束给删除掉。

alter table stu  drop primary key;   --删除主键。

SELECT * FROM STU;

INSERT INTO STU VALUES (1,'F',NULL,1);  ---INSERT 成功,证明主键删除成功,负责会报错,因为已经有一条记录的id为1了。

--想要删除外键要麻烦一些,先找找到外键的名称。

select CONSTNAME FROM syscat.references where tabschema='DB2ADMIN' AND TABNAME='STU';

ALTER TABLE STU DROP FOREIGN KEY SQL120302124448000;

INSERT INTO STU VALUES (1,'F',NULL,10); ---成功,证明外键删除成功,因为dq表中的id是没有10的。

insert into stu(id,sex,region) values(1,'F',1);

select * from stu;  --name默认写入no name ,证明default还在起作用。

alter table stu alter name drop default;  --删除默认约束。

delete from stu where name='no name';

insert into stu(id,sex,region) values(1,'F',1);  ---插入记录

select * from stu;  --再次查看,发现name已经没有默认写入

select * from syscat.colchecks where tabschema='DB2ADMIN' AND TABNAME='STU'; --找出sex的check名称

alter table stu drop constraint SQL120302124447910;   --删除约束。

insert into stu (id,sex) values (3,'h');  ---插入成功,证明sex的约束已经删除。

insert into stu (sex) values ('f');  --报错,id不能插入null 值。

alter table stu alter id drop not null;  ---删除非空限制

reorg table stu;

insert into stu (sex) values ('f');  --插入成功。非空限制删除成功。

--db2修改表名称的方法如下:

--rename table SCHEMA_NAME.OLD_TABLE_NAME to SCHEMA_NAME.NEW_TABLE_NAME ;

rename table stu to student;

--需要指出的的是db2不支持修改表字段名称。如果你非要修改那么只能曲线救国了。

--1)增加一个新列;2)新列值等于要改名的列 3)drop旧列

 

 

删除约束可以参考如下链接:

 

http://www.ibm.com/developerworks/data/library/techarticle/dm-0401melnyk/index.html#N10230

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值