在关系医生(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)
);
在上面的代码中,我可以得到Doctor和Clinic表的具体图片。但是,WorksFor关系如何运作?我有点理解外键是如何根据我在Django framework上工作的经验而工作的,但除此之外我不知道在创建外键关系时数据库中会发生什么。 MySQL是否创建了一个全新的表格,其中包含 :WorksFor关系的Doctor和Clinic表的所有属性?
然后有触发器。概念很容易理解。我只会问你是否可以验证以下SQL代码是否与上面的任务描述相匹配。简而言之,当旧诊所的ID与新诊所的ID不同时,我创建一个新表,其中包括医生的名字,姓氏,旧诊所名称,新诊所名称。同样,我不完全确定外键是如何工作的。当我调用current.Name它会给我Clinic的名字,因为Clinic_ID引用了Clinic关系吗?和博士一样,下面的代码是否可以工作,或者我错过了什么?
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);
答案 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;
|