SQL约束混淆

时间:2015-03-29 15:31:25

标签: sql oracle foreign-keys ddl

我现在有点混合,我有一个名为Avatars的表,它有一个名为Family的外键。现在,在家庭表中,我有两个名为Mother and Father的外键 - 现在这是令人困惑的位,在Mother和Father Table中,有一个名为Avatar_ID的外键,当然是Avatars表的主键。我不确定在SQL PLUS中是否允许这样做。

每当我尝试输入表格“家人,母亲或父亲”时,我都会收到错误:ORA-02291:违反了完整性约束(SG304.FK_FATHER_ID) - 未找到父密钥。

这有什么办法吗?或者我必须完全更改我的代码吗?代码示例如下。

CREATE TABLE Avatars (
Avatar_ID VARCHAR(10) NOT NULL,
Avatar_Name VARCHAR(30),
AvA_DOB DATE,
Age VARCHAR(30),
Gender VARCHAR(30),
Strength_Indicated INT,
Hoard INT,
Avatar_Level VARCHAR(30),
Skill VARCHAR(30),
Original_Owner VARCHAR(30),
Family_ID VARCHAR(10) NOT NULL,
Species_ID VARCHAR(10) NOT NULL,
Inventory_ID VARCHAR(30) NOT NULL,
Weapon_ID VARCHAR(10),
Player_ID VARCHAR(10) NOT NULL,
PRIMARY KEY (Avatar_ID));

CREATE TABLE Family (
Family_ID VARCHAR(10) NOT NULL,
Mother_ID VARCHAR(10) NOT NULL,
Father_ID VARCHAR(10) NOT NULL,
primary key(Family_ID)
);

CREATE TABLE Mother (
Mother_ID VARCHAR(10) NOT NULL,
Avatar_ID VARCHAR(10) NOT NULL,
primary key(Mother_ID)
);

CREATE TABLE Father (
Father_ID VARCHAR(10) NOT NULL,
Avatar_ID VARCHAR(10) NOT NULL,
primary key(Father_ID)
);

ALTER TABLE Avatars
ADD CONSTRAINT fk_Family_ID
FOREIGN KEY (Family_ID)
REFERENCES Family(Family_ID);

ALTER TABLE Family
ADD CONSTRAINT fk_Mother_ID
FOREIGN KEY (Mother_ID)
REFERENCES Mother(Mother_ID);

ALTER TABLE Family
ADD CONSTRAINT fk_Father_ID
FOREIGN KEY (Father_ID)
REFERENCES Father(Father_ID);

ALTER TABLE Father
ADD CONSTRAINT fk_Avatar_ID
FOREIGN KEY (Avatar_ID)
REFERENCES Avatars(Avatar_ID);

ALTER TABLE Mother
ADD CONSTRAINT fk_Avatars_ID
FOREIGN KEY (Avatar_ID)
REFERENCES Avatars(Avatar_ID);

INSERT INTO Avatars (Avatar_ID,Avatar_Name,AvA_DOB,Age,Gender,Strength_Indicated,Hoard,Avatar_Level, Skill, Original_Owner, Family_ID,Species_ID,Inventory_ID,Player_ID) VALUES
('Ava01','Verda','20-JAN-2014','1 year 2 months','Female','100','20','Master','Leader',' - ',' - ','DRA1','MasterInventory','Player07');

提前感谢您提供的任何帮助! (:

1 个答案:

答案 0 :(得分:1)

外键是指父表中的记录。在INSERT语句中,您将值' - '插入到列parent_id中。在此错误消息中,oracle通知您表' - '的列family_id中没有值为family的记录。据我所知,您正试图将' - '用作“缺乏价值”。这有特殊价值 - NULL。所以你需要把你的陈述写成:

INSERT INTO Avatars (Avatar_ID, Avatar_Name, AvA_DOB, 
   Age, Gender, Strength_Indicated, Hoard, Avatar_Level, Skill, 
   Original_Owner, Family_ID, Species_ID, Inventory_ID, Player_ID) 
VALUES ('Ava01', 'Verda', '20-JAN-2014', '1 year 2 months' ,'Female', 
   '100', '20', 'Master', 'Leader', NULL, NULL, 'DRA1', 
   'MasterInventory', 'Player07');

另外,我可以向您的架构推荐一些更改。首先,对主键使用number数据类型 - 它允许您使用sequences生成唯一值。另外,我不知道问题的细节,但表格中的“家庭关系”看起来有点复杂。您可以在一个表格中对其进行描述:

create table family_tree (
  person_id number primary key,
  father_id number,
  mother_id number,
  sex char(1),
  name varchar2(50),
  family_name varchar2(50));

add constraint fk_mother_id foreign key (mother_id) 
references family_tree (person_id);   

add constraint fk_father_id foreign key (father_id) 
references family_tree (person_id);