--以下语句都是在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