假设我有一个用于存储(数字)数据点的数据库。数据点被组合在一起组成观察值。每个数据点属于一个或多个观察点,并且每个观察点都有一个或多个数据点。因此,我有三个表:
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填充的单个临时表)填充这三个表?我可以分别填充data和obs,没有问题,但是on_obs_data需要知道这两个表中新创建的条目的in。data和obs之间的任何信息都不会重叠,并且除了插入时由数据库生成的id之外,不能保证各自的条目是唯一的。将给定的data条目链接到给定的obs条目的惟一原因是它们最初位于电子表格的同一行。
我正在寻找可以在MySQL中实现而不依赖于客户端脚本的解决方案。
发布于 2011-11-13 06:31:45
考虑到这对于规范化数据库中的引用完整性至关重要,我很惊讶没有一个干净的或广为人知的模式,但以下是我提出的:
data和obs表还有一个额外的字段。让我们称它为tempID。请确保允许此字段具有空值。data和obs tables字段通常从此表中选择,并将临时表中的ID字段放入data和obs表的相应tempID字段中*我故意说‘临时表’而不是‘临时表’,因为显然MySQL不允许临时表具有自动递增的ID字段。ಠ_ಠ
但有些事情仍然困扰着我--我认为这将是任何试图更新规范化数据库的人都会遇到的第一个问题之一。下意识的假设是"MySQL是愚蠢的“或”这些MySQL大师不知道太多“,但我已经了解到,当我试图做出这个假设时,往往是我忽略了一些其他人都知道的显而易见的东西。那么,MySQL社区,我刚刚重新发明了轮子吗?其他人有没有更简单的方法来更新桥接表?或者我使用了错误的术语,没有人能回答这个问题,因为没有人理解它?
https://stackoverflow.com/questions/7894420
复制相似问题