【发布时间】:2013-02-28 18:20:12
【问题描述】:
我的数据库设计是这样的。简写形式:
CREATE TABLE LANDSLIDE (
LNUMBER SERIAL NOT NULL,
PRIMARY KEY (LNUMBER)
...
有 4 张桌子,例如(山体滑坡的一部分)
CREATE TABLE SCARP (
SCPNUM CHAR(7) NOT NULL,
LNUMBER SMALLINT NOT NULL,
FOREIGN KEY (LNUMBER) REFERENCES LANDSLIDE (LNUMBER) ON DELETE CASCADE,
...
);
例如scpnum = scp0001
CREATE TABLE ACCUMULATION (
ACCUNUM CHAR(8) NOT NULL,
LNUMBER SMALLINT NOT NULL,
FOREIGN KEY (LNUMBER) REFERENCES LANDSLIDE (LNUMBER) ON DELETE CASCADE,
...
);
例如accunum = accu0001
CREATE TABLE FRONT (
FRNUM CHAR(6) NOT NULL,
LNUMBER SMALLINT NOT NULL,
FOREIGN KEY (LNUMBER) REFERENCES LANDSLIDE (LNUMBER) ON DELETE CASCADE,
...
);
例如frnum = fr0001
CREATE TABLE OTHER (
OTHERNUM CHAR(9) NOT NULL,
LNUMBER SMALLINT NOT NULL,
FOREIGN KEY (LNUMBER) REFERENCES LANDSLIDE (LNUMBER) ON DELETE CASCADE,
...
);
例如othernum = other0001
还有一张桌子,叫做材料(不同的石头,不同部位的土壤)。
CREATE TABLE MATERIAL (
MATNUMBER VARCHAR(9) NOT NULL,
ROCK,
DISTRIBUTION,
...
PRIMARY KEY(MATNUMBER,ROCK,DISTRIBUTION,...),
CONSTRAINT material_matnumber_scarp_fkey FOREIGN KEY
(MATNUMBER) REFERENCES SCARP (SCPNUM) ON DELETE CASCADE,
CONSTRAINT material_matnumber_accumulation_fkey FOREIGN KEY
(MATNUMBER) REFERENCES ACCUMULATION (ACCUNUM) ON DELETE CASCADE,
CONSTRAINT material_matnumber_front_fkey FOREIGN KEY
(MATNUMBER) REFERENCES FRONT (FRNUM) ON DELETE CASCADE,
CONSTRAINT material_matnumber_other_fkey FOREIGN KEY
(MATNUMBER) REFERENCES OTHER (OTHERNUM) ON DELETE CASCADE
);
当我向材料中插入数据时(在对其他表进行条目之后),它返回一个错误。 错误:在表“material”上插入或更新违反了外键约束“material_matnumber_accumulation_fkey” 详细信息:表“累积”中不存在键(matnumber)=(scp0001)
表格材质应如下所示:
MATNUMBER | ROCK | DISTRIBUTION | ...
----------+------+--------------+------
scp0001 | A | lateral | ...
scp0001 | B | lateral | ...
accu0001 | B | central | ...
scp0002 | C | NULL |
accu0002 | A | lateral |
fr0002 | A | NULL |
scp0003 | B | cantral |
accu0003 | B | lateral |
other0003 | C | NULL |
每个条目都是唯一的,因为 matnumber!
【问题讨论】:
-
那么,
ACCUMULATION中是否有一行ACCUNUM='scp0001'? -
您尝试执行的操作不起作用。 matnumber
scp0001也必须存在于外键引用的所有表中,而不仅仅是SCRAP。您将必须创建多个列,每个外键一个列。您可以使用视图或其他东西将它们全部分组在一列中。 -
我认为你的外键是向后的。
-
阅读表继承
-
检查我的回答你 FRONT 表不能容纳 scp0001 因为它最多只能容纳 scp000 char 6。
标签: sql postgresql foreign-keys