mysql - 替换 MySQL 中的列

标签 mysql

我正在使用一个大型数据库(20 GB)。结构是这样的:

  `Count` int(11) NOT NULL AUTO_INCREMENT,
  `Sensor Name` varchar(100) NOT NULL,
  `Date` datetime NOT NULL,
  `Value` decimal(18,4) DEFAULT NULL

现在,我正在测试通过使用“sensorID”(int)而不是“传感器名称”来减少数据库的大小。

 `Count` int(11) NOT NULL AUTO_INCREMENT,
  `SensorID` smallint(5) unsigned NOT NULL,
  `Date` datetime NOT NULL,
  `Value` float DEFAULT NULL,

我有另一个表(“定义”)来在“sensorID”和“传感器名称”之间映射。

CREATE TABLE  `definition` (
  `SensorID` smallint(5) NOT NULL AUTO_INCREMENT,
  `Sensor Name` varchar(100))

那么,如何才能最有效地用“sensorID”替换Sensor Name?现在,我使用“SELECT”从旧表中选择每个的“日期”和“值”,并将其插入到带有传感器 ID 的新表中

INSERT INTO newtable (SensorID, `Date`, `Value`)
    SELECT 3681, `Date`, `Value` from oldtable where Sensor Name = 'abc';

其中“3681”是我从“definition”表中获取的ID ,但 50% 的数据需要我一周的时间。 JOIN 并不理想,因为使用 20 Gb,需要大量资源才能完成。

最佳答案

首先创建新表传感器并填充其中的所有数据。

使用新表更新旧表的列数据传感器名称,如下所示。

UPDATE oldtable o INNER JOIN sensor s ON o.SensorName = s.SensorName
SET o.Sensorname = s.SensorId;

然后将oldtable的Senson Name的列名和类型更改为SensorID,如下

ALTER TABLE oldtable CHANGE Sensorname SensorId INT(11);

希望这能解决您的问题

关于mysql - 替换 MySQL 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49294347/

相关文章:

c# - C#中的MYSQL如何添加到我的使用中

mysql提取具有最大值的行

mysql - 缩小在 mysql 中的日期添加的行

PHP备份数据库并发送电子邮件

mysql - Node : Insert string of special characters in mysql database

MySQL:循环所有条目以更新父表

mysql - 无法在 mysql 中创建表错误(150)

PHP MySQLi 在插入时将文件重命名为行 ID

php - 如何使用 PHP PDO 解析 MySQL 数据库中的对象数据?

PHP MySQL 表单分页