有没有办法模拟MySQL中的OUTPUT子句,因为我们在SQL Server中有一个OUTPUT子句.
这是我的查询类型
UPDATE employee
SET empage = 10
OUTPUT INSERTED.empid
WHERE (empage < 10)
Run Code Online (Sandbox Code Playgroud)
因为我需要为MySQL服务器数据库提供此功能.
请建议实现此功能的最佳方法.
我需要一次性在数据库中插入数千条记录.我在我的应用程序中使用spring JDBC模板.
下面是我到目前为止编写的代码,它一次执行所有插入.所以,如果我有10,000个用户,他们一次插入.但我想要的是批量执行它们,例如一批500条记录,等等.
@Override
public void saveBatch(final List<Employee> employeeList) {
final int batchSize = 500;
getJdbcTemplate().batchUpdate(QUERY_SAVE,
new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i)
throws SQLException {
Employee employee = employeeList.get(i);
ps.setString(1, employee.getFirstname());
ps.setString(2, employee.getLastname());
ps.setString(3, employee.getEmployeeIdOnSourceSystem());
}
@Override
public int getBatchSize() {
return employeeList.size();
}
});
}
Run Code Online (Sandbox Code Playgroud)
如何更改上面的代码,以便代替employeeList.size()作为批量大小,我们可以将批量大小称为500,执行它们然后下一个500,依此类推?
请帮忙.
使用Connector/J,我想在主表中进行批量插入,然后将批量插入到详细信息表中(PreparedStatement.executeBatch()
对于两者).我没有在网上找到太多的信息,所以我正在寻找有这方面经验的人的任何反馈.
我可以使用
Statement.getGeneratedKeys()
获取主表中新插入的行的ID,以便我可以在详细信息插入中将它们用作外键吗?
如果不是每个查询都导致插入(例如,有一个insert
ignore
或insert ... on duplicate
key update
查询),该怎么办?我会Statement.getGeneratedKeys()
为每个陈述或仅针对新陈述添加一行吗?
什么会
Statement.getGeneratedKeys()
回到那里与被插入的主记录一个错误,并
continueBatchOnError
设置为true
连接字符串中?
Connector/J版本5.0.x与5.5.x之间的相关行为是否有任何差异?MySQL 5.0 vs 5.1怎么样?
还有其他任何我应该注意的问题或陷阱吗?
有一个更好的方法吗?
我试图将大量用户插入到具有两个表的MySQL数据库中:
第一个表包含用户数据.示例INSERT
如下所示(id
是主键,mail
是唯一键):
INSERT INTO users (id, mail, name)
VALUES (NULL, "foo@bar.tld", "John Smith")
ON DUPLICATE KEY UPDATE name = VALUE(name)
Run Code Online (Sandbox Code Playgroud)
第二个表包含用户所属的组.它只存储两个外键users_id
和groups_id
.示例查询如下所示:
INSERT INTO users_groups (users_id, groups_id)
VALUES (LAST_INSERT_ID(), 1)
Run Code Online (Sandbox Code Playgroud)
此设置适用于小型数据集.当我导入大量数据(> 1M行)时,INSERT
s变慢.显然,进行批量插入会好得多:
INSERT INTO users (id, mail, name)
VALUES (NULL, "foo@bar.tld", "John Smith"), (NULL, "baz@qux.tld", "Anna Smith")
ON DUPLICATE KEY UPDATE name = VALUE(name)
Run Code Online (Sandbox Code Playgroud)
和:
INSERT INTO users_groups (users_id, groups_id)
VALUES (LAST_INSERT_ID(), 1), (LAST_INSERT_ID(), 4)
Run Code Online (Sandbox Code Playgroud)
问题当然是,LAST_INSERT_ID()
只返回批处理的一个(第一个)id INSERT …
好.所以缺点是,我试图做一个INSERT SELECT,例如:
START TRANSACTION;
INSERT INTO dbNEW.entity (commonName, surname)
SELECT namefirst, namelast
FROM dbOLD.user;
SET @key = LAST_INSERT_ID();
INSERT INTO dbNEW.user (userID, entityID, other)
SELECT user_id, @key, other
FROM dbOLD.user;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
当然@key不会从每个插入返回每个后续的LAST_INSERT_ID(),而只返回最后一个插入的ID.
基本上,我将旧的USER表拆分为ENTITY和USER,如:
dbOLD.user
+-------------+---------------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------------+------+-----+------------+----------------+
| user_id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| namefirst | varchar(20) | NO | | | |
| namelast | varchar(20) | NO | …
Run Code Online (Sandbox Code Playgroud) 我目前正在将一个旧的 PHP 项目迁移到 Node.js,并且正在努力使用 mysqljs/mysql 模块。
我必须执行批量插入 - 到目前为止一切顺利,效果很好。但我还需要所有 insertId。不幸的是我只在回调中得到第一个 insertId 。
假设变量“nestedDataArray”有四个要插入的数据数组 - 所以我们应该得到 4 个新行。这是一个例子:
db.query({
sql: 'INSERT INTO `table` (`field1`, `field2`, `field3`) VALUES ?;',
timeout: 5000,
values: [ nestedDataArray ] // This works as intended.
}, function(error, result){
if (error) {
// ... handle error
} else {
var id = result.insertId; // Here I get only the first one. What about the other three inserts?
db.query( /* Yes, there are nestes queries. */ );
}
}); …
Run Code Online (Sandbox Code Playgroud) INSERT INTO details (idactivity,user,hours,val,date) VALUES ('981','133','0','10500','2008-07-01'),('981','184','0','2750','2008-07-01'),('981','184','0','2750','2008-07-01')
Run Code Online (Sandbox Code Playgroud)
(iddetails如细节表PK)
有没有办法获得3个新的iddetails并让他们进入下一个批量插入查询?
INSERT INTO activity (idactivity,iddetails) VALUES('981',??),('981',??),('981',??)
Run Code Online (Sandbox Code Playgroud) mysql ×6
sql ×3
database ×2
connector-j ×1
java ×1
javascript ×1
jdbc ×1
lastinsertid ×1
node.js ×1
php ×1
spring-jdbc ×1