我有3个表,其中的表入侵者有属于CCTVS和警报表的外键。我希望我的入侵表中的外键为空。我不知道为什么,但我不能将数据插入我的‘侵入’表。这是我的代码:
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)
;此代码不起作用:
INSERT
INTO
REMOTE_SECURITY.INTRUSIONS
(
INTRUSION_ID
, CCTV_ID
, ALARM_ID
) VALUES (
1
, NULL
, 1
)
;以下是错误:
[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).发布于 2018-11-19 21:20:49
外键强制列为非空列。如果您想要外键关联,它将不知道如何将null与另一个表关联。从文件中
外键约束指定列(或一组列)中的值必须与另一表的某一行中的值相匹配。我们说这维护了两个相关表之间的引用完整性。
发布于 2018-11-21 02:23:05
你的Error很清楚..。不能将Null值设置为Foreign Key或Serial。也许你在概念设计上错了你的schema。
CREATE TABLE tablename (
colname SERIAL
);相当于指定:
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中的值引用的是父值,即PK。PK不能有Null所以FK也..。
发布于 2018-11-21 07:30:16
外键列(在您的情况下是intrusions.cctv_id或intrusions.alarm_id )应该将而不是定义为serial,因为您不希望每次插入它们时都生成新的值。使用从引用的主键列生成的值。
正如dwir182所指出的,serial列被隐式定义为not null。通过修正FK列的不正确定义,您将能够插入空值。
所以你想:
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
);然后,您可以执行以下操作:
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
https://stackoverflow.com/questions/53381631
复制相似问题