SQL关系,触发器和外键

时间:2012-05-08 21:25:53

标签: mysql sql database

  

在关系医生(SSN,First_Name,Last_Name),诊所(身份证,姓名,   地址)和WorksFor(Doctor_SSN,Clinic_ID),添加一个触发器:当a   医生从一家诊所转到另一家诊所,提交报告   插入医生的名字以及新旧名称   诊所名称为doctor_transfer关系。

我希望有人解释下面的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 framework上工作的经验而工作的,但除此之外我不知道在创建外键关系时数据库中会发生什么。 MySQL是否创建了一个全新的表格,其中包含 :WorksFor关系的Doctor和Clinic表的所有属性?

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

  3. 触发

    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);
    

1 个答案:

答案 0 :(得分:1)

#1

  

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

MySQL documentation表示以下[强调我的]

  

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