【问题标题】:Check atribute value from another table using a foreign key in table creation在创建表时使用外键检查另一个表的属性值
【发布时间】:2018-12-13 19:50:40
【问题描述】:

是否可以在创建表时检查不同表中的属性值?例如我有这张桌子票:

CREATE TABLE ticket
(
    id_ticket_pk NUMBER(4) PRIMARY KEY,
    hand_in_date DATE NOT NULL,
    num_clothes NUMBER(4) NOT NULL,
    deposite NUMBER (8,2) NOT NULL,
    comment VARCHAR2(40),
    tax NUMBER(5,3) NOT NULL,
    status VARCHAR2(15) NOT NULL,
    id_counter_fk1 NUMBER(4),
    id_client_fk2  NUMBER(4),

    CONSTRAINT ticket_id_counter_fk1 
        FOREIGN KEY (id_counter_fk1) REFERENCES empleado(id_employee_pk),
    CONSTRAINT ticket_id_client_fk2 
        FOREIGN KEY(id_client_fk2) REFERENCES client(id_client_pk)
);

此表与雇员表相关,该表具有一个名为 type 的属性,该属性可以等于 C - 代表柜台,S- 代表秘书等...我想知道是否可以在创建时添加约束验证插入的员工的表有一个employee.type = 'C',其中employee.id_pk = ticket.id_counter_fk2。还是我必须创建一个外部函数或客户端应用程序来管理它?

【问题讨论】:

  • 您是否要求引用两个远程表的外键?
  • 是的,我想做的是使用外键计数器的约束,从员工中选择员工 id = 计数器 id,验证所述员工的类型是 C(计数器)。我最终做的是一个管理数据插入、删除和修改的客户端应用程序。
  • "有一个employee.type = 'C' where employee.id_pk = ticket.id_counter_fk2" 不清楚。请使用足够多的单词、句子和对部分示例的引用来清楚。 (然后用谷歌搜索你会发现:) PS 有一个常见的习惯用法允许声明性约束强制执行(因此避免触发),你在 id 上声明一个 FK 加上在票证中添加的(子类型/变体)标签列,其值为 'C ' 在每一行。 (最好是计算/生成的。)它碰巧违反了 2NF——就像任何不是 CK 函数的计算/生成的列一样——但这不是正确执行约束的问题。

标签: sql validation foreign-keys oracle10g create-table


【解决方案1】:

您似乎在问是否可以使用外键机制来确保只有具有“柜台”职位的人才能创建支持票。

简短的回答是否定的,您不能在此表上使用外键来检查员工表 pk 中 id_counter_fk1 中给定的值并强制员工类型为 C

您可以通过其他几种方式进行操作,最直接的是触发器,如果​​链接的员工不是 C 类型,则阻止插入,但是存在 FK 机制以确保远程记录存在与否,而不是它存在并且有特殊的属性

【讨论】:

    猜你喜欢
    • 2018-07-14
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2013-01-08
    • 2022-10-03
    • 1970-01-01
    相关资源
    最近更新 更多