我有一个具有以下结构的表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'
。此日期不包括在数据中。对于一个CCD_ 3函数调用;值将不同,但是对于一个函数调用monthlyDate
将相同。因此,与其将其添加到数据中,我希望有一种方法可以在查询中单独传递monthlyDate,这样我就不必将数据修改为具有monthlyDate
值。
方法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 |
+------+-----------+----+--------------+
方法2:更新语句
由于您存储的是创建的时间,因此可以在表上为在特定时间间隔内创建的行激发更新语句。我不知道如何在你使用的框架中做到这一点。这相当于运行以下sql:
update table set monthly_date = d3 where created_date > d1 and created_date < d2;
除非对created_date列进行了索引,否则我不建议使用第二种方法。这也可以更新未插入的行。
一种方法是向所有数组中添加一个mysql格式的日期;行";并插入生成的阵列
因为数据是我添加了CCD_ 6的字符串,所以CCD_。
这一切都在内存中运行,使用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)
});
}
});
}