我的表A是否应该从表B主键和通过经文中有外键?

发布于 2025-01-19 11:45:14 字数 1016 浏览 2 评论 0原文

我想知道我的以下代码,它可以作为我的主要键是serial_no,而外键是从我的计划表speguled_no中获取的。通过经文主键将进行计划,并从我的飞机表serial_no中取出外键。

我尝试为我的计划表插入值,但是它出现了一个错误,该错误无法从父键中获取数据,这是我的serial_no。

我应该在预定表中删除serial_no作为我的外键,还是有其他方法可以做?

/* 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);

I would like to know my below code, will it be able to work as my PRIMARY KEY for Airplane is Serial_No and FOREIGN KEY is taken from my Scheduled table, Scheduled_No. Via verse PRIMARY KEY for Scheduled will be Scheduled_No and FOREIGN KEY is taken from my Airplane table, Serial_No.

I try to insert value for my Scheduled table, but it gives an error that, is unable to take data from parent key which is my Serial_No.

Should I remove Serial_No as my FOREIGN KEY in the Scheduled table or is there any other way to do it?

/* 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);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

酷到爆炸 2025-01-26 11:45:14

您有循环引用。


您应该弄清楚表所指的内容:

  • 飞机代表具有容量,唯一标识符(即尾巴上的数字)的物理对象,并且是特定的品牌和模型。
  • 计划表示物理对象在某个时间点所做的工作。即在特定日期,它将飞行特定的路线。

在这种情况下,飞机拥有单个scheduled_no,因为有很多时间点,而且飞机可以在不同的时间内具有不同的时间表,因此您希望每个飞机及其时间表之间都有一对多的关系。

飞机表中不应有一个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)
);

You have circular references.


You should work out what your tables refer to:

  • An AIRPLANE represents the physical object which has a capacity, a unique identifier (i.e. the number on the tail) and is a particular make and model.
  • A SCHEDULE represents what the physical object does at a point in time. I.e. on a particular date it will be flying a particular route.

In this case, it does not make sense for an AIRPLANE to have a single Scheduled_No as there can be many points in time and the airplane can have different schedules at different times so you want there to be a one-to-many relationship between each airplane and its schedules.

There should not be a Scheduled_No column in the AIRPLANE table and, since there shouldn't be a column, there should not be the foreign key constraint. You just want the constraint on Serial_No going back in the other direction. Removing that column and the corresponding constraint will solve your issue of circular referential constraints.

/* 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)
);
缘字诀 2025-01-26 11:45:14

你能做到;修改外键约束(在飞机上),使其可延迟(即在提交时检查一切是否正常,而不是插入)。

像这样的事情:

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.

测试:插入飞机现在可以工作,尽管其父scheduled_no行/值不存在Yet:

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>

You can do it; modify foreign key constraint (on airplane) so that it is deferrable (i.e. check whether everything is OK at time of commit, not insert).

Something like this:

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.

Pay attention to this command:

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.

Testing: insert into airplane now works, although its parent scheduled_no row / value doesn't exist yet:

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.

Insert a row into the scheduled table. Foreign keys must match.

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.

Succeeded as well; now, commit:

SQL> COMMIT;

Commit complete.

SQL>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文