我的表A应该有表B主键中的外键吗

  • 本文关键字: database oracle foreign-keys
  • 更新时间 :
  • 英文 :


我想知道我下面的代码,它是否能够工作,因为我的飞机主密钥是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>

相关内容

  • 没有找到相关文章

最新更新