设计带有已检查列或列的表,并引用可更新的主键

时间:2016-10-24 14:41:22

标签: triggers db2 foreign-keys primary-key create-table

在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列上的外键的候选者到code3countries列的主键。但是如果有任何国家的3-char代码更新,将无法以简单的方式更新它。 我知道这种情况的更新不会经常发生,可以通过先将新数据插入countries,然后更新users中的值,然后删除countries中的旧值来手动完成但遗憾的是会有更多类似的表,在插入另一个表的过程中必须检查数据,并且引用表中的数据会经常更新,然后手动更新会让人感到不舒服。当然,如果users中的更新完成,我希望更新countries中的数据。

我想问的是如何解决这个问题。我考虑了一些beforeinstead 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`

你可以告诉我吗?

提前致谢

1 个答案:

答案 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;