【发布时间】:2016-10-24 14:41:22
【问题描述】:
我在 DB2 中创建/设计表时遇到了一个问题。
我有两个表,表users 和表countries 创建如下所示
create table users
(
firstname varchar(20) not null,
lastname varchar(20) not null,
gender char(1) not null check (gender in ('M','F')),
birthdate date not null,
country char(3) not null,
)
create table testing.countries
(
name varchar(60) not null,
code2 char(2) not null,
code3 char(3) not null
)
我想在表users 的列country 中有一个原产国的 3 字符代码,并在插入数据期间检查它是否有效(或者最好说它是否存在)存储在表countries 中的国家/地区列表。
因为 DB2 不支持检查选项中的子查询/子选择(这对我来说是最好的),所以它看起来像 users 中的列 country 上的外键候选对象,引用主键在countries 中的code3 列上。但万一有任何国家的三字符码更新,简单的更新是不可能的。
我知道更新不会那么频繁,可以手动完成,首先将新数据插入countries,然后更新users中的值,然后删除countries中的旧值,但不幸的是会有更多类似的表,在插入期间必须根据另一个表检查数据,并且引用表中的数据将经常更新,然后手动更新很不舒服。当然,我希望更新users 中的数据,以防countries 中的更新完成。
我想问的是如何解决这个问题。我考虑过一些 before 或 instead of 触发器,但 BEFORE 不能用于更改其他表中的数据,并且 INSTEAD OF 期望 UNTYPED VIEW 而不是 TABLE
SQL0159N The statement references an object that identifies an unexpected
object type. Object: "COUNTRIES". Object type: "TABLE". Expected object type:
"UNTYPED VIEW". LINE NUMBER=2. SQLSTATE=42809`
你能告诉我吗?
提前致谢
【问题讨论】:
-
它听起来就像你想要一个外键约束,而不是一个触发器。
-
是的,外键是选项之一,但是如何使表
countries中的列code3在被引用时可更新? -
您是否可以控制更新数据的过程?是否有可能在那里执行完整性而不是通过数据库约束?
-
@dan1111:你到底是什么意思?
标签: triggers db2 foreign-keys primary-key create-table