为啥我收到错误:插入表时列中有空值?

Posted

技术标签:

【中文标题】为啥我收到错误:插入表时列中有空值?【英文标题】:Why am I getting error: null value in column when inserting into a table?为什么我收到错误:插入表时列中有空值? 【发布时间】:2021-03-02 06:58:20 【问题描述】:

我在postgresql中有两张表,如下:

用户表:

CREATE TABLE public.users
(
    user_id integer NOT NULL DEFAULT nextval('users_user_id_seq'::regclass),
    first_name character varying(90) COLLATE pg_catalog."default" NOT NULL,
    last_name character varying(90) COLLATE pg_catalog."default" NOT NULL,
    email citext COLLATE pg_catalog."default" NOT NULL,
    user_password character varying(90) COLLATE pg_catalog."default" NOT NULL,
    business_status boolean NOT NULL,
    phone_number character varying(12) COLLATE pg_catalog."default" NOT NULL,
    bt_id integer,
    bs_id integer,
    is_active boolean NOT NULL,
    is_verified boolean NOT NULL,
    CONSTRAINT users_pkey PRIMARY KEY (user_id),
    CONSTRAINT users_email_key UNIQUE (email),
    CONSTRAINT bs_id FOREIGN KEY (bs_id)
        REFERENCES public.business_step (bs_id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE
        NOT VALID,
    CONSTRAINT bt_id FOREIGN KEY (bt_id)
        REFERENCES public.business_type (bt_id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE
        NOT VALID
)

管理表:

CREATE TABLE public.admin
(
    admin_id integer NOT NULL DEFAULT nextval('admin_admin_id_seq'::regclass),
    user_id integer NOT NULL,
    CONSTRAINT admin_pkey PRIMARY KEY (admin_id),
    CONSTRAINT user_id FOREIGN KEY (user_id)
        REFERENCES public.users (user_id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE
)

我正在使用 Nodejs 实现一个路由,我可以使用以下代码在其中插入一个新管理员:

Queries.js 中的代码

const insertAdmin = (request, response) => 
    const  user_id  = request.body

    pool.query('INSERT INTO admin (user_id) VALUES ($1)', [user_id], (error, results) => 
        if (error) 
            throw error
        
        response.status(201).send(`User added with ID: $result.insertId`)
    )

index.js 中的代码

app.post('/admins/insert', db.insertAdmin)

使用以下 curl 路由插入新管理员时:

curl --data "user_id =39" http://localhost:3000/users

我收到以下错误消息:

错误:关系“admin”的“user_id”列中的空值违反非空约束 在 Parser.parseErrorMessage (C:\Users\ealfo\node-api-postgres\node_modules\pg-protocol\dist\parser.js:278:15) 在 Parser.handlePacket (C:\Users\ealfo\node-api-postgres\node_modules\pg-protocol\dist\parser.js:126:29) 在 Parser.parse (C:\Users\ealfo\node-api-postgres\node_modules\pg-protocol\dist\parser.js:39:38) 在套接字。 (C:\Users\ealfo\node-api-postgres\node_modules\pg-protocol\dist\index.js:10:42) 在 Socket.emit (events.js:315:20) 在 addChunk (_stream_readable.js:309:12) 在 readableAddChunk (_stream_readable.js:284:9) 在 Socket.Readable.push (_stream_readable.js:223:10) 在 TCP.onStreamRead (internal/stream_base_commons.js:188:23) 长度:265, 严重性:'错误', 代码:'23502', detail: '失败的行包含 (12, null).', 提示:未定义, 位置:未定义, 内部位置:未定义, 内部查询:未定义, 其中:未定义, 架构:'公共', 表:'管理员', 列:'user_id', 数据类型:未定义, 约束:未定义, 文件:'d:\pginstaller_13.auto\postgres.windows-x64\src\backend\executor\execmain.c', 行:'1965', 例程:'ExecConstraints'

为什么会出现此错误消息?我是使用 NodeJS 和 PostgreSQL 的新手,如果这个问题已在另一篇文章中得到解答,我深表歉意。尽管如此,我想了解更多,并从我的错误中吸取教训。提前谢谢你。

【问题讨论】:

嗯,user_id 必须为 NULL。 不,user_id 不为 NULL。 那么你就不会得到那个错误。 这就是这篇文章的重点。我不应该得到这个错误,但它仍然给我这个错误。 【参考方案1】:

您必须将 body-parser 添加到您的中间件。根据 curl 命令判断,您需要从 url 解析正文。

类似的东西。

const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded( extended: true )); // to pass bodies from url

body-parser 库的完整文档可以找到:https://github.com/expressjs/body-parser

【讨论】:

还要去掉user_id后面的空格。即 curl --data "user_id =39" localhost:3000/users 应该是 curl --data "user_id=39" localhost:3000/users

以上是关于为啥我收到错误:插入表时列中有空值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不断收到此错误:SQL 命令未正确结束以插入值? [复制]

SQL 在行中的第一个空列中插入 MySQL 错误

Django错误。插入表时不能分配必须是实例

通过 PHP 将数据插入 MySQL 表时出错

为什么我加入表时列变得不明确?

在长原始列中插入值