如何在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中将一列值作为静态插入?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MYSQL 中选择具有 MAX(列值)的行,按另一列进行分区?
如何在ClickHouse中将具有相同列值的mysql行分组为一行?