2017-01-13 40 views
0

我正在学习mySQL。我正在使用mySQL工作台和Linux终端的混合物来解决这个问题。我正在努力处理外键和触发器。我想我可能误解了其中的一个或两个,这就是造成混乱的原因。我希望有人不能只是提供代码来解决问题,但向我解释我的误解。mysql数据库中外键和触发器的基本用法

我已经创建了两个名为“组织和人员”的小表。在这种情况下,他们有一对多的关系:许多人可以为一个组织工作,但一个人只能为一个组织工作。因此,我使用相同的名称'organisation_id'作为外键将组织表主键'organisation_id'插入到人员表中。我这样做是为了让我可以使用人员表中的外键来跟踪哪些人在哪个组织工作。然后,我的目标是在人员中添加新人时自动使用触发器更新外键,从而跟踪谁在哪个组织工作。我无法弄清楚如何做到这一点。如果我向人员表中添加一个条目,该表格如何找出行中丢失的单元格?我误解了一对多关系和外键吗?任何人都可以告诉我如何正确编写代码并告诉我哪里出了问题?我知道这可能是一个基本的问题,但我需要帮助。从MySQL工作台

我的表代码如下:

CREATE SCHEMA IF NOT EXISTS `learning` DEFAULT CHARACTER SET utf8 ; 
USE `learning` ; 


CREATE TABLE IF NOT EXISTS `learning`.`organisation` (
`organisation_id` INT UNSIGNED NOT NULL DEFAULT 1, 
`org_name` VARCHAR(45) NOT NULL, 
`org_website` VARCHAR(45) NULL, 
PRIMARY KEY (`organisation_id`)) 
ENGINE = InnoDB; 


CREATE TABLE IF NOT EXISTS `learning`.`people` (
`people_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
`name` VARCHAR(45) NULL, 
`job` VARCHAR(45) NULL, 
`organisation_id` INT UNSIGNED NOT NULL, 
PRIMARY KEY (`people_id`), 
INDEX `fk_organisation_id_idx` (`organisation_id` ASC), 
CONSTRAINT `fk_organisation_id` 
FOREIGN KEY (`organisation_id`) 
REFERENCES `learning`.`organisation` (`organisation_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION) 
ENGINE = InnoDB; 
+0

你的多对一似乎是正确的,至于触发器,你能否详细说明'如果我向人员表中添加一个条目,表格怎么能够找出它所在行中缺失的单元格?' –

+0

我的意思是如果我更新表添加一个新的行我如何获得触发器语句来自动填充新插入的行中的people.organisation_id单元格。我认为这是一个AFTER INSERT语句,但语法让我有点困惑。我需要思考下面的影子。 –

+0

组织中的新行?或者在人员表中新增一行? –

回答

1

你理解正确的外键的概念,而不是它的应用。

是的,它可以帮助你peopleorganisation关联,并确保你只能输入一个有效的organisation_idpeople表(有效期=存在于organisation表)。

但是,数据库无法自己找出一个人属于哪个组织。这是你需要在插入本身提供的东西。

在使用此数据库的应用程序中,会有一个用于将people添加到数据库的表单。在该表单上,您需要提供用户属于哪个组织。

on deleteon update条款外键定义实际上适用于organisation表:如果organisation_id场被删除/在organisation表更新,那么什么样的行动应该在people表中获取。

+0

感谢阴影。我想我和你在一起。例如,如果它是通过Java应用程序访问的,则它们可能是标记为* Organization的字段。然后用户输入的数据将在组织表中查找,并且organisation.organisation_id值将作为people.organisation_id的值复制到整个表中。我理解正确吗?有没有办法让这种自动化发生在数据库端,而不是让脚本处理表单呢?如果我是通过Java来完成这项工作的,并且数据库位于某个服务器上,那么这会不会让这一切运行缓慢? –

+0

是的,你说得对。再次,如果数据库不知道该决定,您将如何在数据库级别做出此决定? – Shadow

+0

这使我认为如果数据库中的表之间的关系的完整性归结为接口代码的逻辑,为什么要使用声明的外键?例如,在我的表中,如果我没有外键people.organisation_id,而是有另一列叫做'雇主'的INT,它没有被声明为外键,并且我使用接口代码来复制organisation.organisation_id添加到每个新条目的people.employer列中。这将如何不同?我不了解什么? –