2016-11-09 8 views
0

私はSQLクエリを書くために、POSTGRES SQL、PGADMIN 3、NODE.JSを使用しています。私のNode.jsでは私のコードは次のようになります -重複したユーザーを返すSQL

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); 

問題があるときにI POSTとURL/api/userを使用してpostmanを使って投稿し、名前と電子メール{"name": "Sam"、 "email": "[email protected]"}は与えられたuser_idでorder_idテーブルを生成します。ですから、私のusersテーブルには、userid:1 name:Sam、email:[email protected]のようなものがあります。これで、ユーザーIDはSERIAL PRIMARY KEYとして設定されます。その考え方は、1人のユーザーが多くの注文をするということです。だから私は同じ情報を{"name": "Sam"、 "email": "[email protected]"}を使って再び投稿するとき、私は新しいユーザーIDを取得する:2名前:Sam email:[email protected]。明らかにこれは間違っています。同じユーザー以来私に別のユーザー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で2回サムを取得しないようにするにはどうすればよいですか? ありがとう

答えて

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$ 
関連する問題