【问题标题】:ERROR: null value in column "column_name" of relation "relation_name" violates not-null constraint错误:关系“relation_name”的“column_name”列中的空值违反非空约束
【发布时间】:2021-12-30 15:35:12
【问题描述】:

我有这张桌子:

DROP TABLE IF EXISTS mission CASCADE;

CREATE TABLE mission 
(
    id_mission SERIAL PRIMARY KEY,
    task_description VARCHAR(255) NOT NULL
);

一个任务可以依赖另一个任务来解锁。所以我有下一个反身表:

DROP TABLE IF EXISTS depends CASCADE;

CREATE TABLE depends 
(
    id_mission_1 INTEGER,
    id_mission_2 INTEGER, -- it can be null (optional)
    FOREIGN KEY (id_mission_1) REFERENCES mission (id_mission),
    FOREIGN KEY (id_mission_2) REFERENCES mission (id_mission),
    PRIMARY KEY (id_mission_1, id_mission_2)
);

我正在像这样从另一个表中导入数据:

INSERT INTO depends(id_mission_1, id_mission_2)
    SELECT quest_id, quest_depends
    FROM player_quest;

player_quest 表如下所示:

我们可以看到并不是所有的任务都相互依赖,所以可以有空值。

我收到以下错误:

错误:关系“depends”的“id_mission_2”列中的空值违反了非空约束

失败的行包含 (14, null)。

我该如何解决这个问题?

数据库:PostgreSQL

【问题讨论】:

  • 主键列永远不能为空。

标签: sql postgresql


【解决方案1】:

主键列永远不能为空。请改用UNIQUE 约束:

CREATE TABLE depends 
(
    id_mission_1 INTEGER,
    id_mission_2 INTEGER, -- it can be null (optional)
    FOREIGN KEY (id_mission_1) REFERENCES mission (id_mission),
    FOREIGN KEY (id_mission_2) REFERENCES mission (id_mission),
    UNIQUE (id_mission_1, id_mission_2)
);

请注意,可以插入多个 (14, null) 行!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-18
    • 2012-11-02
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2016-01-18
    相关资源
    最近更新 更多