首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法插入数据,postgresql上的外键错误

无法插入数据,postgresql上的外键错误
EN

Stack Overflow用户
提问于 2018-11-19 19:46:30
回答 3查看 1.8K关注 0票数 1

我有3个表,其中的表入侵者有属于CCTVS和警报表的外键。我希望我的入侵表中的外键为空。我不知道为什么,但我不能将数据插入我的‘侵入’表。这是我的代码:

代码语言:javascript
复制
CREATE  TABLE
REMOTE_SECURITY.CCTVS(CCTV_ID   serial);

CREATE  TABLE
REMOTE_SECURITY.ALARMS(ALARM_ID serial);

CREATE  TABLE
REMOTE_SECURITY.INTRUSIONS(INTRUSION_ID serial,CCTV_ID  serial,ALARM_ID serial);

ALTER   TABLE
REMOTE_SECURITY.CCTVS   ADD CONSTRAINT
CCTVS_PK    PRIMARY KEY
(CCTV_ID)
;
ALTER   TABLE
REMOTE_SECURITY.ALARMS  ADD CONSTRAINT
ALARMS_PK   PRIMARY KEY
(ALARM_ID)
;

此代码不起作用:

代码语言:javascript
复制
  INSERT
    INTO
        REMOTE_SECURITY.INTRUSIONS
    (
        INTRUSION_ID
    ,   CCTV_ID
    ,   ALARM_ID
    ) VALUES (
        1
    ,   NULL
    ,   1
    )
    ;

以下是错误:

代码语言:javascript
复制
[2018-11-19 19:35:59] [23502] ERROR: null value in column "cctv_id" violates not-null constraint
[2018-11-19 19:35:59] Detail: Failing row contains (1, null, 1, 2010-02-01 07:00:01).
EN

回答 3

Stack Overflow用户

发布于 2018-11-19 21:20:49

外键强制列为非空列。如果您想要外键关联,它将不知道如何将null与另一个表关联。从文件中

外键约束指定列(或一组列)中的值必须与另一表的某一行中的值相匹配。我们说这维护了两个相关表之间的引用完整性。

https://www.postgresql.org/docs/9.4/ddl-constraints.html

票数 0
EN

Stack Overflow用户

发布于 2018-11-21 02:23:05

你的Error很清楚..。不能将Null值设置为Foreign KeySerial。也许你在概念设计上错了你的schema

代码语言:javascript
复制
CREATE TABLE tablename (
    colname SERIAL
);

相当于指定:

代码语言:javascript
复制
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

正如Documentation Serial数据类型注意到的那样,持有Not Null,所以它不能是Null和其他答案,非常好,告诉你约束外键。

正如Documentation FK所说

我们说这维护了两个相关表之间的引用完整性。

所以..。FK中的值引用的是父值,即PKPK不能有Null所以FK也..。

票数 0
EN

Stack Overflow用户

发布于 2018-11-21 07:30:16

外键列(在您的情况下是intrusions.cctv_idintrusions.alarm_id )应该将而不是定义为serial,因为您不希望每次插入它们时都生成新的值。使用从引用的主键列生成的值。

正如dwir182所指出的,serial列被隐式定义为not null。通过修正FK列的不正确定义,您将能够插入空值。

所以你想:

代码语言:javascript
复制
CREATE TABLE remote_security.intrusions
(
  intrusion_id   serial,
  -- no serial for the foreign key columns!
  cctv_id        integer references cctvs,
  alarm_id       integer references alarms
);

然后,您可以执行以下操作:

代码语言:javascript
复制
insert into remote_security.cctvs values (default); -- creates id = 1;
insert into remote_security.alarms values (default); -- creates id = 1;

-- do not specify a value for the serial column!
insert into remote_security.intrusions 
  (intrusion_id, cctv_id, alarm_id)
values 
  (default, null, 1);

请参阅在线示例:https://rextester.com/ELPHK12991

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53381631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档