在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
)
我希望在表country
的列users
中包含原始国家/地区的3-char代码,并在插入要检查的数据时是否有效(或者更好地说它存在于表countries
中的国家列表中。
因为DB2不支持检查选项中的子查询/子选择(这对我来说是最好的),所以它看起来像country
引用中users
列上的外键的候选者到code3
中countries
列的主键。但是如果有任何国家的3-char代码更新,将无法以简单的方式更新它。
我知道这种情况的更新不会经常发生,可以通过先将新数据插入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`
你可以告诉我吗?
提前致谢
答案 0 :(得分:0)
尝试这样的事情:
create table testing.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
)
ALTER TABLE testing.users ADD CONSTRAINT testing.PK_Users PRIMARY KEY
(firstname, lastname);
ALTER TABLE testing.countries ADD CONSTRAINT testing.PK_Countries PRIMARY KEY
(code3);
ALTER TABLE testing.users ADD CONSTRAINT testing.FK_Users_Countries FOREIGN KEY
(country)
REFERENCES testing.users
(code3)
ON DELETE CASCADE;