如何一次插入两个表?准备好的发言
How to insert in two tables in one time? prepared statements
如何一次插入两个表
我需要插入第二个表user_information
字段user_id
,第一个表user
插入返回id
,我找到了这个答案,但我找不到如何使用params准备语句
var dbQuery = 'WITH insertUser AS (
INSERT INTO "user" (status, create_date) VALUES ($1, $2) RETURNING id
)
, insertUserInformation AS (
INSERT INTO user_information (user_id, email) VALUES ($3, $4)
)
';
yield queryPromise(dbClient, dbQuery, [status, timestamp, ??, email]);
pg
使用事务。这样,要么提交所有查询,要么不提交任何查询。并且在执行完所有查询之前的不完整状态对于其他进程是不可见的。
有关如何在node-postgres
中执行事务的更多信息,请访问https://github.com/brianc/node-postgres/wiki/Transactions
作为参考,最相关的部分是:
var Client = require('pg').Client;
var client = new Client(/*your connection info goes here*/);
client.connect();
var rollback = function(client) {
//terminating a client connection will
//automatically rollback any uncommitted transactions
//so while it's not technically mandatory to call
//ROLLBACK it is cleaner and more correct
client.query('ROLLBACK', function() {
client.end();
});
};
client.query('BEGIN', function(err, result) {
if(err) return rollback(client);
client.query('INSERT INTO account(money) VALUES(100) WHERE id = $1', [1], function(err, result) {
if(err) return rollback(client);
client.query('INSERT INTO account(money) VALUES(-100) WHERE id = $1', [2], function(err, result) {
if(err) return rollback(client);
//disconnect after successful commit
client.query('COMMIT', client.end.bind(client));
});
});
});
这在postgresql中是不可能的。我通过创建函数并简单地使用参数执行,解决了完全相同的问题。正如我在您的表结构中看到的,您没有太多属性,所以这将相对容易。
示例代码:
function.sql
CREATE OR REPLACE FUNCTION createSomething
(
IN attr1 VARCHAR(20),
IN attr2 VARCHAR(200)
)
RETURNS void AS $$
DECLARE userId INTEGER;
BEGIN
INSERT INTO table1 (col1, col2) VALUES
(
attr1,
attr2
) RETURNING id INTO userId;
INSERT INTO table2 (user_id, col11, col2) VALUES
(
userId,
col11,
col12
);
END;
$$ LANGUAGE plpgsql;
用法:
SELECT createSomething('value1', 'value2');
请注意,第二个insert语句将知道最近用户的id是什么,并将使用它。
PostgreSQL Prepared Statements不会让你这么做。你必须使用事务。
下面是您使用pg promise实现的示例,使用ES7语法:
const pgp = require('pg-promise')({
// initialization options;
});
const db = pgp(/* your connection object or string */);
db.tx(async t => {
const user = await t.one('INSERT INTO user(status, create_date) VALUES($1, $2) RETURNING id', [status, timestamp]);
return t.none('INSERT INTO user_information(user_id, email) VALUES($1, $2)', [user.id, email]);
})
.then(() => {
// SUCCESS;
})
.catch(error => {
// ERROR;
});
我不认为这可以作为一个自然的sql语句来实现。你必须把它包装成一个过程或其他机制。
相关文章:
- JQuery合并了keyup和focusout两个函数
- 如何使用 node.js 比较两个 json 数组
- 为复选框javascript指定两个值
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 如何一次插入两个表?准备好的发言
- 开发两个单独的节点应用程序来提供 Web 服务和使用 Web 服务以在浏览器上呈现它是一个好主意吗?
- 有一个功能可以将字符串很好地缩短为一个、两个或三个字母
- 有没有更好的方法将两个值中最大的值分配给一个属性
- 有两个函数更好的做法,还是有一个复杂的函数
- 如何将多个预先准备好的日期存储到localStorage
- 两个字符串的特殊连接的更好方法
- $.Document.在同一页上已准备好两次,将首先执行
- 更好的方法来显示两个PHP变量切换jQuery Ajax
- 一个接一个地注册两个不同的鼠标按下事件的好方法是什么?
- 当两个单独的Ajax调用完成时,调用函数的好方法是什么?
- 在javascript中,比较变量时使用两个等号还是三个等号更好
- 特别是当我们必须在两个日期之间选择数据时,以下哪个JSON更好
- 两个窗口的Javascript代码可用性.加载和文档.准备好了
- 如何组合两个$(文档).使用jQuery准备回调
- 性能方面,算法复杂性方面,下面两个JS函数中哪一个用于将字符串的第一个字母大写更好,为什么?