一、新建测试表
[db2inst2@db2 ~]$ db2 "create table tank01(sid int not null,name varchar(40) not null,constraint pk_id primary key(sid))"
DB20000I SQL 命令成功完成。
[db2inst2@db2 ~]$ db2 "create table tank02(sid int,name varchar(30) not null,constraint fk_id foreign key(sid) references tank01(sid) on delete restrict)"
DB20000I SQL 命令成功完成。
[db2inst2@db2 ~]$
二、主健约束测试
[db2inst2@db2 ~]$ db2 "insert into tank01 values(100,'tank.zhang')"
DB20000I SQL 命令成功完成。
[db2inst2@db2 ~]$ db2 "insert into tank01 values(101,'tank.zhang')"
DB20000I SQL 命令成功完成。
[db2inst2@db2 ~]$ db2 "insert into tank02 values(101,'tank.zhang')"
DB20000I SQL 命令成功完成。
[db2inst2@db2 ~]$ db2 "insert into tank02 values(103,'tank.zhang')"
DB21034E 该命令被当作 SQL
语句来处理,因为它是无效的“命令行处理器”命令。在 SQL
处理期间,它返回:
SQL0530N FOREIGN KEY "DB2INST2.TANK02.FK_ID"
的插入或更新值不等于父表的任何父键值。 SQLSTATE=23503
[db2inst2@db2 ~]$ db2 "insert into tank02 values(100,'tank.zhang')"
DB20000I SQL 命令成功完成。
[db2inst2@db2 ~]$
三、测试在父表中执行truncate table
[db2inst2@db2 ~]$ db2 "delete from tank02" //清理子表数据
DB20000I SQL 命令成功完成。
[db2inst2@db2 ~]$ db2 "truncate table tank01 immediate" //清理父表出错
DB21034E 该命令被当作 SQL
语句来处理,因为它是无效的“命令行处理器”命令。在 SQL
处理期间,它返回:
SQL20356N 无法截断 "DB2INST2.TANK01" 表,因为此表存在 DELETE
触发器,或者此表是引用约束中的父表。 SQLSTATE=428GJ
[db2inst2@db2 ~]$
四、关闭子表外健的约束
[db2inst2@db2 ~]$ db2 "ALTER TABLE tank02 ALTER FOREIGN KEY fk_id NOT ENFORCED"
DB20000I SQL 命令成功完成。
[db2inst2@db2 ~]$ db2 "truncate table tank01 immediate"
DB20000I SQL 命令成功完成。
[db2inst2@db2 ~]$ db2 "ALTER TABLE tank02 ALTER FOREIGN KEY fk_id ENFORCED" //开启子健约束,由于子表中存在有数据故报错
DB21034E 该命令被当作 SQL
语句来处理,因为它是无效的“命令行处理器”命令。在 SQL
处理期间,它返回:
SQL0667N 因为表包含带有外键值的行,而在父表的父键中找不
到这些外键值,所以不能创建 FOREIGN KEY "FK_ID"。 SQLSTATE=23520
[db2inst2@db2 ~]$ db2 "truncate table tank02 immediate" //清理子表数据
DB20000I SQL 命令成功完成。
[db2inst2@db2 ~]$ db2 "ALTER TABLE tank02 ALTER FOREIGN KEY fk_id ENFORCED" //开启子健约束
DB20000I SQL 命令成功完成。
[db2inst2@db2 ~]$
阅读(2182) | 评论(0) | 转发(0) |