2

在关系 Doctor(SSN, First_Name, Last_Name), Clinic (ID, Name, Address) 和 WorksFor(Doctor_SSN,Clinic_ID) 中,添加触发器:当医生从一个诊所转移到另一个诊所时,通过插入医生的第一个来提交报告和姓氏以及新旧诊所名称进入医生转移关系。

我希望有人解释以下 SQL 代码是否正确,以及触发器和外键如何工作。

CREATE TABLE Doctor(
    SSN INT PRIMARY KEY,
    First_Name VARCHAR(50),
    Last_Name VARCHAR(50),
);

CREATE TABLE Clinic(
    ID INT PRIMARY KEY,
    Name VARCHAR(50),
    Address VARCHAR(255),
);

CREATE TABLE WorksFor(
    Doctor_SSN INT REFERENCES Doctor(SSN),
    Clinic_ID INT REFERENCES Clinic(ID)
);
  1. 在上面的代码中,我可以得到 Doctor 和 Clinic 表的具体图片。但是 WorksFor 关系如何工作?从我在Django 框架上工作的一点经验中,我有点了解外键是如何工作的,但除此之外,我不知道创建外键关系时数据库中会发生什么。MySQL 是否会创建一个全新的表,其中包含WorksFor 关系Doctor 和 Clinic 表的所有属性?

  2. 然后是触发器。概念相当容易理解。我只想问您是否可以验证以下 SQL 代码是否与上面的任务描述匹配。简而言之,当旧诊所的 ID 与新诊所的 ID 不同时,我会创建一个新表,其中包含医生的名字、姓氏、旧诊所名称、新诊所名称。同样,我不完全确定外键是如何工作的。当我调用 current.Name 时,它​​会给我诊所的名称,因为 Clinic_ID 引用了诊所关系?和Doctor一样,下面的代码会起作用还是我错过了什么?

扳机

CREATE TRIGGER DoctorTransfer(
    AFTER UPDATE ON WorksFor
    REFERENCING
        OLD ROW AS current
        NEW ROW AS new
    FOR EACH ROW
    WHEN(current.Clinic_ID <=> new.Clinic_ID)
    INSERT INTO doctor_transfer VALUES
        VALUES(new.First_Name, new.Last_Name, current.Name as Old Clinic,
                         new.Name as New Clinic);
4

1 回答 1

1

对于 #1

MySQL 是否会创建一个全新的表,其中包含 WorksFor 关系的 Doctor 和 Clinic 表的所有属性?

MySQL文档说以下[强调我的]

InnoDB需要外键和引用键上的索引,以便外键检查可以快速且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。如果引用表不存在,则会在引用表上自动创建此类索引。如果您创建另一个可用于强制外键约束的索引,则此索引可能会在稍后被静默删除。index_name,如果给定,如前所述使用。

InnoDB 允许外键引用任何索引列或列组。但是,在引用的表中,必须有一个索引,其中引用的列按相同顺序列为第一列。

所以不,它只使用索引,因为 FK 只关心被引用表中键的存在(插入到子表中)或引用表中引用者的存在(删除/更新父母)

对于 #2 你有一些语法问题。

这是来自Create Trigger文档的示例触发器。没有REFERENCES关键字。否WHEN它只是直接引用NEW并使用标准WHERE从句

CREATE TRIGGER testref BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a2 = NEW.a1;
    DELETE FROM test3 WHERE a3 = NEW.a1;
    UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
  END;
|
于 2012-05-08T21:55:39.137 回答