我是靠谱客的博主 激情月亮,最近开发中收集的这篇文章主要介绍db2中constraint_DB2 外键约束,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

测试表

-- 创建测试主表. ID 是主键.CREATE TABLE test_main (  id      INT   NOT NULL,  value   VARCHAR(10),  PRIMARY KEY(id)  );

-- 创建测试子表. CREATE TABLE test_sub (  id      INT  NOT NULL,  main_id INT ,  value   VARCHAR(10),  PRIMARY KEY(id)  );

-- 插入测试主表数据.INSERT INTO test_main(id, value) VALUES (1, 'ONE');INSERT INTO test_main(id, value) VALUES (2, 'TWO');

-- 插入测试子表数据.INSERT INTO test_sub(id, main_id, value) VALUES (1, 1, 'ONEONE');INSERT INTO test_sub(id, main_id, value) VALUES (2, 2, 'TWOTWO');

默认外键约束方式

db2 => ALTER TABLE test_sub ADD CONSTRAINT main_id_cons  FOREIGN KEY (main_id)  REFERENCES  test_main;DB20000I  SQL 命令成功完成。

db2 => DELETEdb2 (cont.) =>   test_maindb2 (cont.) => WHEREdb2 (cont.) =>   ID = 1;DB21034E  该命令被当作 SQL 语句来处理,因为它是无效的"命令行处理器"命令。在SQL 处理期间,它返回:SQL0532N  因为关系 "WZQ.TEST_SUB.MAIN_ID_CONS" 限制删除,所以不能删除父行。SQLSTATE=23504

测试完毕后,删除 外键约束 ALTER TABLE test_sub DROP CONSTRAINT main_id_cons;

DELETE CASCADE 方式

db2 => ALTER TABLE test_subdb2 (cont.) =>   ADD CONSTRAINT main_id_consdb2 (cont.) =>     FOREIGN KEY (main_id)db2 (cont.) =>       REFERENCES  test_main   ON DELETE CASCADE;DB20000I  SQL 命令成功完成。

db2 => -- 测试删除主表数据. 将成功地执行.db2 => DELETEdb2 (cont.) =>   TEST_MAINdb2 (cont.) => WHEREdb2 (cont.) =>   ID = 1;DB20000I  SQL 命令成功完成。

-- 测试检索子表,应该只有一条 main_id = 2 的数据.db2 =>  SELECT * FROM test_sub;

ID          MAIN_ID     VALUE----------- ----------- ----------          2           2 TWOTWO

1 条记录已选择。

测试完毕后,删除 外键约束 ALTER TABLE test_sub DROP CONSTRAINT main_id_cons;

UPDATE CASCADE方式

DB2 不支持

db2 => ALTER TABLE test_subdb2 (cont.) =>   ADD CONSTRAINT main_id_consdb2 (cont.) =>     FOREIGN KEY (main_id)db2 (cont.) =>       REFERENCES test_maindb2 (cont.) =>         ON UPDATE CASCADE;DB21034E  该命令被当作 SQL 语句来处理,因为它是无效的"命令行处理器"命令。在SQL 处理期间,它返回:SQL0104N  在 "ON UPDATE" 后面找到异常标记"CASCADE"。预期标记可能包括:"RESTRICT, NO ACTION"。  SQLSTATE=42601

SET NULL方式

db2 => ALTER TABLE test_subdb2 (cont.) =>   ADD CONSTRAINT main_id_consdb2 (cont.) =>     FOREIGN KEY (main_id)db2 (cont.) =>       REFERENCES  test_maindb2 (cont.) =>         ON DELETE SET NULL;DB20000I  SQL 命令成功完成。

db2 => -- 测试删除主表数据. 将成功地执行.db2 => DELETE TEST_MAIN WHERE ID = 2;DB20000I  SQL 命令成功完成。

db2 =>  -- 测试检索子表,应该有一条的 main_id = nulldb2 => SELECT * FROM test_sub;

ID          MAIN_ID     VALUE----------- ----------- ----------          2           - TWOTWO

1 条记录已选择。

关于非主键的外键设置-- 创建测试主表.  无主键.CREATE TABLE test_main2 (  id      INT   NOT  NULL,  value   VARCHAR(10));

-- 创建测试子表. CREATE TABLE test_sub2 (  id      INT   NOT  NULL,  main_id INT,  value   VARCHAR(10),  PRIMARY KEY(id)  );

-- 插入测试主表数据.INSERT INTO test_main2(id, value) VALUES (1, 'ONE');INSERT INTO test_main2(id, value) VALUES (2, 'TWO');

-- 插入测试子表数据.INSERT INTO test_sub2(id, main_id, value) VALUES (1, 1, 'ONEONE');INSERT INTO test_sub2(id, main_id, value) VALUES (2, 2, 'TWOTWO');

db2 => ALTER TABLE test_sub2db2 (cont.) =>   ADD CONSTRAINT main_id_cons2db2 (cont.) =>     FOREIGN KEY (main_id)db2 (cont.) =>       REFERENCES  test_main2(id);DB21034E  该命令被当作 SQL 语句来处理,因为它是无效的"命令行处理器"命令。在SQL 处理期间,它返回:SQL0573N  在约束 "MAIN_ID_CONS2" 的引用子句中指定的列列表不标识父表或昵称"WZQ.TEST_MAIN2" 的唯一约束。  SQLSTATE=42890

db2 => ALTER TABLE test_main2db2 (cont.) =>   ADD UNIQUE (id);DB20000I  SQL 命令成功完成。

db2 => ALTER TABLE test_sub2db2 (cont.) =>   ADD CONSTRAINT main_id_cons2db2 (cont.) =>     FOREIGN KEY (main_id)db2 (cont.) =>       REFERENCES  test_main2(id);DB20000I  SQL 命令成功完成。

最后

以上就是激情月亮为你收集整理的db2中constraint_DB2 外键约束的全部内容,希望文章能够帮你解决db2中constraint_DB2 外键约束所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部