【问题标题】:returning duplicate users SQL返回重复用户 SQL
【发布时间】:2016-11-09 18:43:49
【问题描述】:

所以我使用 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 和 url '/api/user 给它一个名称和电子邮件 {"name":"Sam","email":"Sam@gmail.com"} 它在邮递员上发帖时使用给定的 user_id 生成一个 order_id 表。所以我的用户表会有类似用户 ID:1 名称:Sam,电子邮件:Sam@gmail.com。现在用户 ID 被设置为 SERIAL PRIMARY KEY。这个想法是一个用户会有很多订单。因此,当我使用 {"name":"Sam","email":"Sam@gmail.com"} 再次发布相同的信息时,我得到了一个新的用户 ID: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
)

我怎样才能防止创建订单而不是两次使用不同的用户 ID 获取 Sam? 谢谢

【问题讨论】:

    标签: sql node.js postgresql


    【解决方案1】:

    对于这样的事情,我使用存储过程。在这种情况下,我从 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$
    

    【讨论】:

      猜你喜欢
      • 2018-03-01
      • 2011-10-26
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      相关资源
      最近更新 更多