概述
测试表
-- 创建测试主表. 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 外键约束所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复