外键在MySQL中的应用/实用程序是什么?

时间:2011-01-23 06:12:40

标签: java mysql

请允许我用一个例子详细说明这个问题。我写的是 透视

(1)字节码不应该用于实现逻辑 在数据库引擎中实现(希望更有效)(例如,如果我们 作为SQL查询的结果,需要过滤掉500行中的20行 我们应该写一个更好的where子句),那个

(2)我只有一个概念 了解外键(例如,它们自动创建,管理和执行 保持不同表之间数据完整性所需的约束。)

现在,让我们考虑一个包含4个表和15列的简单模式 如下(假设所有列都不为空):

people
    pid bigint autoinc PK
    fname   varchar(32)
    lname   varchar(32)
    dob date
    sex char(1)
    addyID  bigint FK to address(aid)

relationship
    relof   bigint FK to people(pid)
    relto   bigint FK to people(pid)
    relis   tinyint

address
    aid bigint autoinc PK
    street  varchar(128)
    zipcode int FK to z2cs(zip)

z2cs
    zip int PK
    city    varchar(64)
    state   char(2)

期望(请回答以下6的真/假)

  1. 可以使用外键创建上述表关系 指向同一个表的不同行
  2. 向关系添加行会抛出SQLException(如果是relof或relto) 在人们中缺失
  3. 如果我们在地址中添加一行,我们无需检查z2cs中是否存在邮政编码 - 缺少zip会抛出SQLException
  4. 如果在人员中使用了辅助工具,则尝试从地址中删除行会引发异常
  5. 如果在关系中使用了pid,则尝试从人员中删除行会导致错误 列relto或relof
  6. 存在一个SQL语句,允许您查找表中的哪些列是外键 他们引用哪个表(列)(我知道“描述tablename”不会这样做, 虽然我觉得应该)
  7. 如果上述任何一项的答案都是错误的,请指导我找到 究竟什么是MySql中的外键合约。谢谢。

    PS:如果您回答[6]的回答,请与大家分享一下这句话。

    奖金问题(与FK无关):

    如何为满足以下约束的关系表编写create语句:

    1. relof和relto不能相同
    2. relof和relto的组合是独一无二的,即 如果它们是[relof = 584,relto = 7823]的行,则不能插入另一行 [relof = 584,relto = 7823]或[relof = 7823,relto = 584]

1 个答案:

答案 0 :(得分:0)

<强> 1。可以使用指向同一表的不同行的外键来创建上述表关系

不,FK只能指向一行。但是,行可以被许多其他行引用,例如,地址可以被许多人引用。

<强> 2。如果人员中缺少relof或relto,则向关系添加行会抛出SQLException

YES。

第3。如果我们在地址中添加一行,我们不需要检查z2cs中是否存在zipcode - 缺少zip会抛出SQLException

YES。

<强> 4。如果在人员中使用了辅助,则尝试从地址中删除行会引发异常

是,如果FK中没有级联删除,则会自动删除 进入人而不是失败。

<强> 5。如果在relto或relof列中的关系中使用pid,则尝试从人员中删除行会导致错误

是,见4。

<强> 6。存在一个SQL语句,它允许您查找表中的哪些列是外键以及它们引用哪个表(列)(我知道“描述tablename”不会这样做,尽管我觉得应该这样做)

AFAIK。 MySQL中应该有一个信息模式,您可以从中查询信息。

<强> B1。 relof和relto不能相同

在更新或插入时使用触发器来验证这一点。 PostgreSQL知道CHECK约束,这可能也可以在MySQL中使用,但是你可以选择触发器。

<强> B2。 relof和relto的组合是独一无二的

这两列上的组合UNIQUE INDEX是你的朋友。