如何在mysql中将一列值作为静态插入?

Posted

技术标签:

【中文标题】如何在mysql中将一列值作为静态插入?【英文标题】:How to insert one column value as static in mysql? 【发布时间】:2020-08-28 07:26:35 【问题描述】:

我有一张表business_data,结构如下

+-----------------+---------------+------+-----+----------------------+-------+
| Field           | Type          | Null | Key | Default              | Extra |
+-----------------+---------------+------+-----+----------------------+-------+
| id              | varchar(36)   | NO   | PRI | NULL                 |       |
| monthlyDate     | date          | NO   |     | 1970-01-01           |       |
| transactionId   | varchar(255)  | NO   |     | NULL                 |       |
| transactionType | varchar(255)  | NO   |     | NULL                 |       |
| number          | varchar(255)  | NO   |     | NULL                 |       |
| description     | text          | NO   |     | NULL                 |       |
| amount          | decimal(20,2) | NO   |     | NULL                 |       |
| active          | tinyint(4)    | NO   |     | 1                    |       |
| createdAt       | datetime(6)   | NO   |     | CURRENT_TIMESTAMP(6) |       |
| updatedAt       | datetime(6)   | NO   |     | CURRENT_TIMESTAMP(6) |       |
| version         | int(11)       | NO   |     | NULL                 |       |
| businessId      | varchar(36)   | YES  |     | NULL                 |       |
+-----------------+---------------+------+-----+----------------------+-------+

我正在使用一个函数将数据插入到这个表中

 saveBusinessData(dbConnection: any) 

        let data = '[["32447e98-6a8b-40d0-a70f-157739089be1",666,"2020-08-26","some description",4,"4565","Bill",true,1]]'
        return new Promise(async (resolve, reject) => 

            if (data.length > 0) 
                let qry =
                    "INSERT INTO business_data (id, businessId, amount,date,description,number,transactionId, transactionType, active, version,monthlyDate) VALUES ?";

                dbConnection.query(qry, [data], async function (err: any, res: any) 
                    if (err) 

                        reject(err);
                    


                    resolve(true)

                );

            
        );

    

有列'monthlyDate'。该日期不包括在数据中。对于一个 saveBusinessData 函数调用,将有多个行和值将不同,但对于一个函数调用,monthlyDate 将是相同的。因此,与其将其添加到数据中,我想要一种方法可以单独在查询中传递monthlyDate,这样我就不必修改数据以具有monthlyDate 值。

【问题讨论】:

请看meta.***.com/questions/333952/… 但对于一个函数调用来说,monthlyDate 将是相同的。 ...但对于不同的调用它会有所不同。所以这种“优化”毫无意义。 是的,但是可以有 1000 条记录,并且日期将相同并且日期不包含在数据中,所以我不想修改数据。所以这就是为什么我正在寻找那个解决方案 所以不要将它添加到数据中你为什么不想将它添加到数据中? 我不想修改数据,因为它是一个记录数组,可以有 1000 个。和日期将相同,所以我想添加到查询中。 【参考方案1】:

一种方法是在所有数组中添加 mysql 格式的日期到所有“行”并插入结果数组

因为数据是我添加的字符串let arr = JSON.parse(data);,所以unshift可以工作。

这一切都在内存中运行,应该很快就会有 1000 个左右的元素

saveBusinessData(dbConnection: any) 

    let data = '[["32447e98-6a8b-40d0-a70f-157739089be1",666,"2020-08-26","some description",4,"4565","Bill",true,1]]'
    return new Promise(async (resolve, reject) => 

        if (data.length > 0) 
           let arr = JSON.parse(data);
           let index;
           for (index = 0; index < arr.length; ++index) 

                arr[index].unshift(date.toISOString().slice(0, 10));
           
            let qry =
                "INSERT INTO business_data (monthlyDate,id, businessId, amount,date,description,number,transactionId, transactionType, active, version,monthlyDate) VALUES ?";

            dbConnection.query(qry, [arr], async function (err: any, res: any) 
                if (err) 

                    reject(err);
                


                resolve(true)

            );

        
    );


【讨论】:

【参考方案2】:

方法 1:触发器

实现此目的的一种方法是使用数据库触发器。每当执行操作时都会执行触发器。您可以将数据库配置为在插入之前触发触发器。例如:

DELIMITER $$

CREATE TRIGGER inserted before INSERT ON hospital
FOR EACH ROW BEGIN
    SET NEW.monthly_date = NOW()/1000;
    --- Insert your logic here ^^
END$$

那么当你插入表格时,月行列会自动插入当前时间戳

insert into hospital (name, bed_count) values ('Name', 2353);

结果:

+------+-----------+----+--------------+
| name | bed_count | id | monthly_date |
+------+-----------+----+--------------+
| Name |      2353 |  3 |  20200907170 |
+------+-----------+----+--------------+

方法二:更新语句

由于您要存储创建时间,因此您可以针对在特定时间间隔内创建的行在表上触发更新语句。我不确定如何在您使用的框架中执行此操作。相当于运行下面的sql:

update table set monthly_date = d3 where created_date > d1 and created_date < d2;

除非 created_date 列被索引,否则我不推荐第二种方法。这也可能会更新您未插入的行。

【讨论】:

以上是关于如何在mysql中将一列值作为静态插入?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中将一列值插入到二维数组中

如何将一列的列值组合到 MySQL 中的另一列中?

如何在 MYSQL 中选择具有 MAX(列值)的行,按另一列进行分区?

如何在ClickHouse中将具有相同列值的mysql行分组为一行?

如何在netbeans java中将图像插入mysql数据库

mysql如何根据一列值更新另一列的值?