我想知道我下面的代码,它是否能够工作,因为我的飞机主密钥是Serial_No,而FOREIGN密钥取自我的Scheduled_No表。通过verse PRIMARY KEY for Scheduled will be Scheduled_No,FOREIGN KEY取自我的飞机表Serial_No。
我试图为我的Scheduled表插入值,但它给出了一个错误,即无法从父键(即我的Serial_No(中获取数据。
我应该在Scheduled表中删除Serial_No作为我的FOREIGN KEY吗?或者有其他方法吗?
/* CREATE TABLE FOR AIRPLANE */
CREATE TABLE AIRPLANE (
Serial_No Varchar2(10) NOT NULL,
Scheduled_No Varchar2(10) NOT NULL,
Flight_No Varchar2(6) NOT NULL,
Model_No Number(3) NOT NULL,
Capacity Number(3) NOT NULL,
Maintenance_Date DATE NULL,
PRIMARY KEY (Serial_No)
);
/* CREATE TABLE FOR SCHEDULED */
CREATE TABLE SCHEDULED (
Scheduled_No Varchar2(10) NOT NULL,
Serial_No Varchar2(10) NOT NULL,
Route_No Varchar2(10) NOT NULL,
Job_No Varchar2(10) NOT NULL,
Flight_Fly_On DATE NOT NULL,
PRIMARY KEY (Scheduled_No),
FOREIGN KEY (Serial_No) REFERENCES AIRPLANE (Serial_No)
);
/* ADDING FK FOR Scheduled_No FROM SCHEDULED */
ALTER TABLE AIRPLANE
ADD FOREIGN KEY (Scheduled_No) REFERENCES SCHEDULED (Scheduled_No);
您有循环引用。
你应该弄清楚你的表格指的是什么:
AIRPLANE
表示具有容量、唯一标识符(即尾部的数字(并且是特定品牌和型号的物理对象SCHEDULE
表示物理对象在某个时间点所做的事情。也就是说,在某个特定的日期,它将按照特定的路线飞行
在这种情况下,AIRPLANE
只有一个Scheduled_No
是没有意义的,因为可能有很多时间点,飞机在不同的时间可能有不同的时间表,所以您希望每架飞机及其时间表之间存在一对多的关系。
AIRPLANE
表中不应该有Scheduled_No
列,而且由于不应该有列,所以不应该有外键约束。您只希望Serial_No
上的约束返回到另一个方向。删除该列和相应的约束将解决循环引用约束的问题。
/* CREATE TABLE FOR AIRPLANE */
CREATE TABLE AIRPLANE (
Serial_No Varchar2(10) NOT NULL,
Flight_No Varchar2(6) NOT NULL,
Model_No Number(3) NOT NULL,
Capacity Number(3) NOT NULL,
Maintenance_Date DATE NULL,
PRIMARY KEY (Serial_No)
);
/* CREATE TABLE FOR SCHEDULED */
CREATE TABLE SCHEDULED (
Scheduled_No Varchar2(10) NOT NULL,
Serial_No Varchar2(10) NOT NULL,
Route_No Varchar2(10) NOT NULL,
Job_No Varchar2(10) NOT NULL,
Flight_Fly_On DATE NOT NULL,
PRIMARY KEY (Scheduled_No),
FOREIGN KEY (Serial_No) REFERENCES AIRPLANE (Serial_No)
);
你可以做到;修改外键约束(在airplane
上(,使其可延迟(即检查提交时是否一切正常,而不是插入(。
类似这样的东西:
SQL> CREATE TABLE AIRPLANE
2 (
3 Serial_No VARCHAR2 (10) NOT NULL,
4 Scheduled_No VARCHAR2 (10) NOT NULL,
5 Flight_No VARCHAR2 (6) NOT NULL,
6 Model_No NUMBER (3) NOT NULL,
7 Capacity NUMBER (3) NOT NULL,
8 Maintenance_Date DATE NULL,
9 PRIMARY KEY (Serial_No)
10 );
Table created.
SQL> CREATE TABLE SCHEDULED
2 (
3 Scheduled_No VARCHAR2 (10) NOT NULL,
4 Serial_No VARCHAR2 (10) NOT NULL,
5 Route_No VARCHAR2 (10) NOT NULL,
6 Job_No VARCHAR2 (10) NOT NULL,
7 Flight_Fly_On DATE NOT NULL,
8 PRIMARY KEY (Scheduled_No),
9 FOREIGN KEY (Serial_No) REFERENCES AIRPLANE (Serial_No)
10 );
Table created.
注意这个命令:
SQL> ALTER TABLE AIRPLANE
2 ADD CONSTRAINT fk_air_sch FOREIGN KEY (Scheduled_No)
3 REFERENCES SCHEDULED (Scheduled_No)
4 INITIALLY DEFERRED DEFERRABLE;
Table altered.
测试:insert into airplane
现在工作,尽管它的父scheduled_no
行/值还不存在:
SQL> INSERT INTO airplane (serial_no,
2 scheduled_no,
3 flight_no,
4 model_no,
5 capacity,
6 maintenance_date)
7 VALUES ('1',
8 '100',
9 'abc',
10 5,
11 100,
12 SYSDATE);
1 row created.
在scheduled
表格中插入一行。外键必须匹配。
SQL> INSERT INTO scheduled (scheduled_no,
2 serial_no,
3 route_no,
4 job_no,
5 flight_fly_on)
6 VALUES ('100',
7 '1',
8 'xyz',
9 'job',
10 SYSDATE);
1 row created.
同样成功;现在,提交:
SQL> COMMIT;
Commit complete.
SQL>