所以我使用POSTGRES SQL,PGADMIN 3和NODE.JS来编写我的sql查询。在我的node.js中,我的代码如下所示: -
var express = require('express'),
cors = require('cors'),
massive = require('massive'),
bodyParser = require('body-parser');
var app = module.exports = express();
app.use(bodyParser.json());
app.use(cors());
app.use(express.static(__dirname + '/public'));
//MASSIVE//
var massiveUrl = 'postgres://localhost/cart';
var massiveServer = massive.connectSync({
connectionString: massiveUrl
});
app.set('db', massiveServer);
var db = app.get('db');
//ENDPOINTS//
app.post('/api/user', function(req, res, next) {
db.user_create([req.body.name,req.body.email],function(err, user) {
console.log('user is this: ', user);
if(err) {
res.status(500).send(err);
}
console.log(user[0].userid);
db.order_create([user[0].userid], function(err, order) {
console.log('order is this: ', order);
if(err) {
return res.status(500).send(err)
}
res.status(200).send('User and Order created successfully');
})
})
});
app.get('/api/user', function(req, res, next) {
db.users(function(err, users) {
if(err) {
res.status(500).send(err);
}
res.status(200).send(users);
})
});
app.listen(3333, function() {
console.log("Listening on port 3333");
});
我的user_create.sql,order_create.sql和users.sql文件如下所示: -
users.sql:-
SELECT *
FROM users
user_create.sql:-
INSERT INTO users (name, email)
VALUES ($1, $2)
RETURNING *;
order_create.sql
INSERT INTO orders (user_id)
VALUES ($1);
问题在于,当我使用POST发布邮递员时,网址' / api / user给它起了一个名字和电子邮件{" name":" Sam", "电子邮件":" Sam@gmail.com"}它生成一个带有给定user_id的order_id表。所以我的用户表会有像userid:1名称:Sam,电子邮件:Sam@gmail.com。现在userid被设置为SERIAL PRIMARY KEY。这个想法是一个用户会有很多订单。所以,当我使用{" name":" Sam"," email":" Sam@gmail.com"}再次发布相同的信息时我得到一个新的用户名:2名:Sam电子邮件:Sam@gmail.com。显然这是错的。它不应该给我另一个用户ID,因为它是同一个用户!
Table structure:-
create table users
(
userid SERIAL PRIMARY KEY,
name VARCHAR(40),
email VARCHAR(255)
)
create table orders
(
id INTEGER,
user_id INTEGER references users(userid),
amounttotal float
)
如何阻止创建订单并且不使Sam使用不同的用户ID? 感谢
答案 0 :(得分:0)
对于这样的事情,我使用存储过程。在这种情况下,我从gps设备获取AVL数据,以便我可以跟踪汽车的移动位置。所以只需要创造一次汽车。
因此,对于您的情况,而不是汽车是用户。
CREATE OR REPLACE FUNCTION avl.car_check(i_car_external_id integer)
RETURNS integer AS
$BODY$
DECLARE
int_newcar_id bigint;
BEGIN
-- CHECK IF CAR ALREADY EXIST AND TRY TO GET ID
SELECT INTO int_newcar_id
car_id -- INTERNAL SERIAL FIELD
FROM
avl.cars_pool
WHERE
car_external_id = i_car_external_id;
IF int_newcar_id IS null THEN
-- CREATE A NEW CAR
INSERT INTO avl.cars_pool
(car_external_id)
VALUES
(i_car_external_id);
-- GET THE NEWLY CREATED ID
SELECT INTO int_newcar_id
car_id
FROM
avl.cars_pool
WHERE
car_external_id = i_car_external_id;
END IF;
RETURN int_newcar_id;
END;
$BODY$