【问题标题】:design of table with checked column or column with reference to primary key which is updatable参考可更新的主键设计具有选中列或列的表
【发布时间】: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 中的更新完成。

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

你能告诉我吗?

提前致谢

【问题讨论】:

  • 听起来就像你想要一个外键约束,而不是一个触发器。
  • 是的,外键是选项之一,但是如何使表countries中的列code3在被引用时可更新?
  • 您是否可以控制更新数据的过程?是否有可能在那里执行完整性而不是通过数据库约束?
  • @dan1111:你到底是什么意思?

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


【解决方案1】:

试试这样的:

      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;

【讨论】:

  • 两个问题:1)为什么要在users表上创建PK?不需要解决这个问题,或者不是? 2) 在表countries 上,真的在name 列上创建一个PK? users 中的列被设计为 char(3) 以匹配 countries 中的 code3 列而不是 name 列,同样用于引用 FK
  • 1) 不是必需的,但表必须有主键,这样更好 2) 是的,如果你想做外键 3) 我修改我的 pk 代码是 contries 表中的 code3
  • 桌子users 上的PK 确实不需要,至少在这种情况下......在countries 更新PK 之后,它开始对我有意义......但仍然如此不是我想要的,也不是我要求的——你提到了ON DELETE CASCADE,但这是我不想要的,当我将(尝试)从countries 中删除一个条目时,我肯定不想被引用来自用户的条目也被删除 - 事实上我想停止所以必须使用 ON DELETE RESTRICTON DELETE NO ACTION 来代替。但是当引用code3 时,我仍然不知道如何使表countries 可更新
猜你喜欢
  • 1970-01-01
  • 2016-09-21
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
相关资源
最近更新 更多