如何将字段从一个表复制到另一个表

时间:2011-07-09 05:20:12

标签: mysql ruby

我已经搜索并尝试了所有但都失败了,并且想知道是否有人可以帮助将这些数据从一个表复制到另一个表时稍微不同寻常的转折。

我正在使用C中的其他人编写的软件从我自己的气象站收集数据。我已经看过这个开源代码,但由于它使用了很多单个字符变量,因此很难阅读它以如下顺序格式将数据写入MySQL数据库表: -

CREATE TABLE readings (
    `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `name` TEXT NOT NULL,
    `value` DOUBLE NOT NULL,
    `id` INT(11) NOT NULL AUTO_INCREMENT
)

每个传感器读数存储在单独的行中。名称表示传感器名称,例如温度传感器或雨量计,风速传感器等等。所有传感器每分钟更新一次。 我发现的问题是这种存储数据的方式使得对它执行查询非常困难,因为我必须在查询中包含许多条件,例如检查'name'字段是否为“RGC1” raingauge计数器等因为雨量传感器实际上只是一个计数器而不是即时降雨率,这真的很复杂。我必须对数据库执行查询并从当前的数据中减去先前的raingauge计数器值,以获得读取这两个时间点之间的计数数。每个计数是0.01英寸的降雨量,因此将计数差异乘以0.01得出降雨率为英寸/间隔。温度传感器稍微容易一些,因为它们是瞬时温度值,但在不同的场合之间仍然很复杂。

我要么需要一种计算这些数据的方法,使数据库结构保持原样(我没有做到令人沮丧)或者每分钟复制新数据,因为它进入另一个存储所有传感器读数的数据库在同一行,这样的事情: -

CREATE TABLE `readings2` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `readdate` DATETIME NULL DEFAULT NULL,
    `MS-TH-TEMP` FLOAT NULL DEFAULT NULL,
    `MS-TH-HUM` FLOAT UNSIGNED NULL DEFAULT NULL,
    `UTEMP` FLOAT NULL DEFAULT NULL,
    `UV` FLOAT UNSIGNED NULL DEFAULT NULL,
    `WSPD` SMALLINT(5) UNSIGNED NULL DEFAULT '0',
    `WDIR` TINYINT(3) UNSIGNED NULL DEFAULT '0',
    `WS-TEMP` FLOAT NULL DEFAULT '0',
    `RGC0` BIGINT(20) UNSIGNED NULL DEFAULT '0',
    `RGC1` BIGINT(20) UNSIGNED NULL DEFAULT '0',
    `LC0` BIGINT(20) UNSIGNED NULL DEFAULT '0',
    `LC1` BIGINT(20) UNSIGNED NULL DEFAULT '0',
    `PRS0` FLOAT UNSIGNED NULL DEFAULT '0',
    `TAI8570-TEMP` FLOAT UNSIGNED NULL DEFAULT '0',
    PRIMARY KEY (`id`)
)

我在Ubuntu Server 11.04上运行所有这些,并且可以使用ruby脚本或类似的东西每分钟在cron作业上复制数据。 有人可以帮忙吗?我已经搜索并尝试了很多来自这个网站的建议,但是我没有努力想出一个解决方案。

除了上面的原始帖子之外,我一直在做很多事情,但是使用下面的代码会遇到持久的语法错误,但如果我看错了,我该死的。如果我注释掉INSERT INTO语句,语法错误就会消失。但是我看不出INSERT中的语法有什么问题: -

DELIMITER $$

DROP TRIGGER /*!50033 IF EXISTS */ `copyFields`$$

CREATE TRIGGER `copyFields` AFTER UPDATE on `readings`
FOR EACH ROW
BEGIN
    DECLARE mychanged INT DEFAULT 0;
    DECLARE newDATE DATETIME DEFAULT NULL;
    DECLARE newMSTHTEMP FLOAT DEFAULT NULL;
    DECLARE newMSTHHUM FLOAT DEFAULT NULL;
    DECLARE newUTEMP FLOAT DEFAULT NULL;
    DECLARE newUV FLOAT DEFAULT NULL;
    DECLARE newWSPD SMALLINT DEFAULT NULL;
    DECLARE newWDIR TINYINT DEFAULT NULL;
    DECLARE newWSTEMP FLOAT DEFAULT NULL;
    DECLARE newRGC0 BIGINT DEFAULT NULL;
    DECLARE newRGC1 BIGINT DEFAULT NULL;
    DECLARE newLC0 BIGINT DEFAULT NULL;
    DECLARE newLC1 BIGINT DEFAULT NULL;
    DECLARE newPRS0 FLOAT DEFAULT NULL;
    DECLARE newTAI8570TEMP FLOAT DEFAULT NULL;
    IF NEW.name = "UTEMP" THEN
        SET mychanged = 1;
    END IF;
    IF mychanged = 1 THEN
        SET newDATE = NEW.date;
    IF NEW.name = 'MS-TH-TEMP' THEN
        SET newMSTHTEMP = NEW.value;
    END IF;
    IF NEW.name = 'MS-TH-HUM' THEN
        SET newMSTHHUM = NEW.value;
    END IF;
    IF NEW.name = 'WSPD' THEN
        SET newWSPD = NEW.value;
    END IF;
    IF NEW.name = 'WDIR' THEN
        SET newWDIR = NEW.value;
    END IF;
    IF NEW.name = 'WS-TEMP' THEN
        SET newWSTEMP = NEW.value;
    END IF;
    IF NEW.name = 'RGC0' THEN
        SET newRGC0 = NEW.value;
    END IF;
    IF NEW.name = 'RGC1' THEN
        SET newRGC1 = NEW.value;
    END IF;
    IF NEW.name = 'UTEMP' THEN
        SET newUTEMP = NEW.value;
    END IF;
    IF NEW.name = 'UV' THEN
        SET newUV = NEW.value;
    END IF;
    INSERT INTO readings2 
        (readdate,
        ms-th-temp,
        ms-th-hum,
        utemp,
        uv,
        wspd,
        wdir,
        ws-temp,
        rgc0,
        rgc1,
        lc0,
        lc1,
        prs0,
        tai8570-temp)
        VALUES (newDATE,
        newMSTHTEMP,
        newMSTHHUM,
        newUTEMP,
        newUV,
        newWSPD,
        newWDIR,
        newWSTEMP,
        newRGC0,
        newRGC1,
        newLC0,
        newLC1,
        newPRS0,
        newTAI8570TEMP);
END IF; 

END $$

DELIMITER;

我得到的错误是: -

SQL错误(1064):您的SQL语法中有错误;检查与MySQL服务器版本对应的手册,以便在'-th-temp,ms-th-hum,utemp,uv,wspd,wdir,ws-temp''第53行附近使用正确的语法

看起来比实际情况复杂,但如果有人能帮我指出正确的方向,我将不胜感激。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我会稍微改变你的表定义,以便所有字段都为空(如未知),直到它们被明确填写。除此之外,使用插入触发器和更新触发器,例如:

create trigger readings_insert
  after insert on readings
  for each row
begin
  -- upsert into readings2
end;

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html