首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找查询/触发器,以便从文件干净地插入到MySQL中的“多对多”或“桥”表中

寻找查询/触发器,以便从文件干净地插入到MySQL中的“多对多”或“桥”表中
EN

Stack Overflow用户
提问于 2011-10-26 02:59:58
回答 1查看 147关注 0票数 0

假设我有一个用于存储(数字)数据点的数据库。数据点被组合在一起组成观察值。每个数据点属于一个或多个观察点,并且每个观察点都有一个或多个数据点。因此,我有三个表:

代码语言:javascript
复制
CREATE TABLE `data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time` datetime NOT NULL,
  `value` int(11) NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB ;

CREATE TABLE `obs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `datetime` datetime NOT NULL,
  `posthoc` tinyint(1) NOT NULL,
  `comments` varchar(500) NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB ;

CREATE TABLE `on_obs_data` (
# linker or bridge table or whatever these are called
  `id_obs` int(11) NOT NULL,
  `id_data` int(11) NOT NULL,
  KEY `id_obs` (`id_obs`),
  KEY `id_data` (`id_data`),
  CONSTRAINT `on_obs_data_ibfk_1` FOREIGN KEY (`id_obs`) REFERENCES `obs` (`id`),
  CONSTRAINT `on_obs_data_ibfk_2` FOREIGN KEY (`id_data`) REFERENCES `data` (`id`)
) ENGINE=InnoDB ;

问题是,如何从单个电子表格(或通过LOAD DATA LOCAL INFILE填充的单个临时表)填充这三个表?我可以分别填充dataobs,没有问题,但是on_obs_data需要知道这两个表中新创建的条目的in。dataobs之间的任何信息都不会重叠,并且除了插入时由数据库生成的id之外,不能保证各自的条目是唯一的。将给定的data条目链接到给定的obs条目的惟一原因是它们最初位于电子表格的同一行。

我正在寻找可以在MySQL中实现而不依赖于客户端脚本的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-13 06:31:45

考虑到这对于规范化数据库中的引用完整性至关重要,我很惊讶没有一个干净的或广为人知的模式,但以下是我提出的:

  1. 确保除了上面示例代码中的字段之外,dataobs表还有一个额外的字段。让我们称它为tempID。请确保允许此字段具有空值。
  2. 创建临时表*时,创建一列唯一的ID。
  3. Insert to dataobs tables字段通常从此表中选择,并将临时表中的ID字段放入dataobs表的相应tempID字段中

*我故意说‘临时表’而不是‘临时表’,因为显然MySQL不允许临时表具有自动递增的ID字段。ಠ_ಠ

但有些事情仍然困扰着我--我认为这将是任何试图更新规范化数据库的人都会遇到的第一个问题之一。下意识的假设是"MySQL是愚蠢的“或”这些MySQL大师不知道太多“,但我已经了解到,当我试图做出这个假设时,往往是我忽略了一些其他人都知道的显而易见的东西。那么,MySQL社区,我刚刚重新发明了轮子吗?其他人有没有更简单的方法来更新桥接表?或者我使用了错误的术语,没有人能回答这个问题,因为没有人理解它?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7894420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档