【问题标题】:How to INSERT INTO table(column) VALUES(value) WHERE column2 = value如何插入表(列)值(值)WHERE column2 = value
【发布时间】:2019-12-17 01:15:18
【问题描述】:

我正在开发一个时钟程序,但我在处理这个查询时遇到了问题:

INSERT INTO users(time_in) VALUES($2) WHERE username = $1

表:

CREATE TABLE users (
id SERIAL PRIMARY KEY NOT NULL, 
username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
time_json VARCHAR,
time_in VARCHAR
);

这是我得到的错误:

error: syntax error at or near "time_in"
at Connection.parseE (\...\node_modules\pg\lib\connection.js:606:11)      
at Connection.parseMessage (\...\node_modules\pg\lib\connection.js:403:19)
at TLSSocket.<anonymous> (\...\node_modules\pg\lib\connection.js:123:22)  
at TLSSocket.emit (events.js:210:5)
at addChunk (_stream_readable.js:308:12)
at readableAddChunk (_stream_readable.js:289:11)
at TLSSocket.Readable.push (_stream_readable.js:223:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:182:23) {
name: 'error',
length: 95, 
severity: 'ERROR',
code: '42601', 
detail: undefined,
hint: undefined,
position: '8',
internalPosition: undefined,
internalQuery: undefined,
where: undefined,
schema: undefined,
table: undefined,
column: undefined,
dataType: undefined,
constraint: undefined,
file: 'scan.l',
line: '1134',
routine: 'scanner_yyerror'}

我正在处理的函数的代码:

function postTimeIn(user, callback) {

const timeIn = getTime();
params = [user, timeIn];

const sql = 'INSERT INTO users(time_in) VALUES($2) WHERE username = $1';

pool.query(sql, params, function (err, result) { ...

【问题讨论】:

  • 这在 Postgres 中不是一个有效的语法:INSERT INTO ... WHERE -- 你是在做一个 upsert 吗? WHERE 子句对 upsert 有效,但这不是你的做法
  • insert query,为什么需要where
  • 我认为这不是有效的语法,但我不确定如何将值插入到给定用户的 time_in 列中
  • 您是否想改用UPDATE

标签: sql node.js postgresql sql-update sql-insert


【解决方案1】:

WHERE 子句对UPDATE 有意义:

UPDATE users
SET    time_in = $2
WHERE  username = $1;

这真的是你想要的吗?

username 应该为此定义 UNIQUE - 并且可能在任何情况下。

time_json 应该是jsonjsonbtime_in 应该是 timestamptz

INSERT 没有任何意义(除了无效的语法),因为您必须同时填写所有 NOT NULL 列而没有列默认值:

username VARCHAR(50) NOT NULL,
password VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,

【讨论】:

  • 有道理,谢谢
【解决方案2】:

问题是您试图插入带有 where 条件的记录。当您插入从另一个表中选择的值时,您只能使用 where 条件作为过滤器 像。 INSERT INTO table(column1,column2,...) SELECT column1,column2,... FROM another_table WHERE condition;

您应该立即按照上面的建议进行更新,因为您正在更改已存在记录的属性值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 2014-04-29
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多