【问题标题】:Which statement is needed to revise?需要修改哪个语句?
【发布时间】:2020-04-02 16:19:13
【问题描述】:

我尝试创建几个表,但只创建了服务器表。请修复我的工作!

CREATE TABLE server 
(
SERVER_ID       varchar(25) NOT NULL,
SERVER_IP       varchar(15)     NOT NULL,
SERVER_LOCATION     varchar(25)     NOT NULL,
SERVER_BRAND    varchar(15)     NOT NULL,
CONSTRAINT server_pk
PRIMARY KEY (SERVER_ID)
);

CREATE TABLE application
(
APP_ID          varchar(25) NOT NULL,
ACCOUNT_NUM varchar(25)     NOT NULL,
RECORD_ID       varchar(10)     NOT NULL,
VERSION_ID      varchar(10)     NOT NULL,
LAST_UPDATED        date        NOT NULL,
CONSTRAINT application_pk
PRIMARY KEY (APP_ID),
CONSTRAINT application _fk_account
FOREIGN KEY (ACCOUNT_NUM)   
REFERENCES account (ACCOUNT_NUM),
CONSTRAINT application _fk_record
FOREIGN KEY (RECORD_ID)         
REFERENCES record (RECORD_ID)
);

CREATE TABLE record
(
RECORD_ID       varchar(25) NOT NULL,
VIN_NUM         varchar(25)     NOT NULL,
SERVER_ID       varchar(25)     NOT NULL,
CONSTRAINT record_pk
PRIMARY KEY (RECORD_ID, VIN_NUM, SERVER_ID),
CONSTRAINT record_fk_vehicle
FOREIGN KEY (VIN_NUM)   
REFERENCES vehicle (VIN_NUM),
CONSTRAINT record_fk_server
FOREIGN KEY (SERVER_ID)
REFERENCES server (SERVER_ID)
);

CREATE TABLE vehicle
(
VIN_NUM     varchar(25) NOT NULL,
V_MILEAGE       int         NOT NULL,
V_GASUSED       varchar(25)     NOT NULL,
V_ELECTRICALMILES   int         NOT NULL,
DRIVER_ID       varchar(25) NOT NULL,
CONSTRAINT vehicle_pk
PRIMARY KEY (VIN_NUM),
CONSTRAINT vehicle_fk_driver
FOREIGN KEY (DRIVER_ID) 
REFERENCES driver (DRIVER_ID)
);

CREATE TABLE driver
(
DRIVER_ID       varchar(25) NOT NULL,
LICENSE_NUM     varchar(25) NOT NULL,
FIRST_NAME      varchar(25) NOT NULL,
LAST_NAME       varchar(25)     NOT NULL,
INSURANCE_POLICY    varchar(25) NOT NULL,
ACCOUNT_NUM int     NOT NULL,
CONSTRAINT driver_pk
PRIMARY KEY (DRIVER_ID),
CONSTRAINT driver_fk_account
FOREIGN KEY (ACCOUNT_NUM)   
REFERENCES account (ACCOUNT_NUM)
);

CREATE TABLE account
(
ACCOUNT_NUM int     NOT NULL,
DRIVER_ID       varchar(25) NOT NULL,
DEVICE_ID       varchar(25) NOT NULL,
DATE_CREATED        date        NOT NULL,
ACCOUNT_STATUS  varchar(10) NOT NULL,
CONSTRAINT account_pk
PRIMARY KEY         (ACCOUNT_NUM, DRIVER_ID),
CONSTRAINT account_fk_driver
FOREIGN KEY (DRIVER_ID)     
REFERENCES driver (DRIVER_ID)
);

【问题讨论】:

  • 你遇到了什么错误?
  • 您的架构看起来不正确。例如,表accountdriver 相互引用。
  • REFERENCES account (ACCOUNT_NUM) - ACCOUNT_NUM 不是帐户表上的“键”。
  • 我收到错误错误报告 - ORA-00942:表或视图不存在 00942. 00000 - “表或视图不存在” *原因:*操作:
  • 请不要在 oracle 中使用 VARCHAR,而是使用 VARCHAR2

标签: sql oracle


【解决方案1】:

这里有几个问题。

您应该按照与外键约束依赖关系匹配的顺序创建表,即您不能先创建明细表,然后再创建主表,因为没有要引用的表(或其主键)。

一个很好的解决方法是从create table 中删除外键约束,并在创建所有表后单独创建它们(使用alter table ... add constraint)。

如果两个表相互引用(例如driveraccount do),如果有充分的理由这样做,则没有问题。但是,正如我之前所说 - 您不能在 create table 语句中执行此操作;至少要移出一个外键。

如果主键由多个列组成(因此它是一个复合键),则外键还必须包含引用它的相同数量和数据类型的列。这就是 driveraccount 表所拥有的。

  • account 的主键是 (account_num, driver_id)
  • driver 的外键不能只是 (account_num) - 它还必须包含 driver_id

最后,application 表:它的外键无法创建,因为它引用了

  • account 表的主键是 (account_num, driver_id),但是 - application 根本不包含 driver_id 列,这可能意味着您错误地设置了 account 的主键(或 application 表)
  • record 表在 (record_id, vin_num, server_id) 上有一个复合主键,而 application 只有 record_id。我为account 写的评论在这里也有效

现在,如果我们修复我提到的问题,会创建表,但 application 会丢失所有外键约束。

SQL> CREATE TABLE server
  2  (
  3  SERVER_ID       varchar2(25) NOT NULL,
  4  SERVER_IP       varchar2(15)     NOT NULL,
  5  SERVER_LOCATION     varchar2(25)     NOT NULL,
  6  SERVER_BRAND    varchar2(15)     NOT NULL,
  7  CONSTRAINT server_pk
  8  PRIMARY KEY (SERVER_ID)
  9  );

Table created.

SQL>
SQL> CREATE TABLE driver
  2  (
  3  DRIVER_ID       varchar2(25) NOT NULL,
  4  LICENSE_NUM     varchar2(25) NOT NULL,
  5  FIRST_NAME      varchar2(25) NOT NULL,
  6  LAST_NAME       varchar2(25)     NOT NULL,
  7  INSURANCE_POLICY    varchar2(25) NOT NULL,
  8  ACCOUNT_NUM int     NOT NULL,
  9  CONSTRAINT driver_pk
 10  PRIMARY KEY (DRIVER_ID)
 11  --CONSTRAINT driver_fk_account
 12  --FOREIGN KEY (ACCOUNT_NUM)
 13  --REFERENCES account (ACCOUNT_NUM)
 14  );

Table created.

SQL>
SQL> CREATE TABLE account
  2  (
  3  ACCOUNT_NUM int     NOT NULL,
  4  DRIVER_ID       varchar2(25) NOT NULL,
  5  DEVICE_ID       varchar2(25) NOT NULL,
  6  DATE_CREATED        date        NOT NULL,
  7  ACCOUNT_STATUS  varchar2(10) NOT NULL,
  8  CONSTRAINT account_pk
  9  PRIMARY KEY         (ACCOUNT_NUM, DRIVER_ID),
 10  CONSTRAINT account_fk_driver
 11  FOREIGN KEY (DRIVER_ID)
 12  REFERENCES driver (DRIVER_ID)
 13  );

Table created.

SQL>
SQL> alter table driver add constraint driver_fk_account
  2  foreign key (account_num, driver_id)
  3  references account (account_num, driver_id);

Table altered.

SQL>
SQL> CREATE TABLE vehicle
  2  (
  3  VIN_NUM     varchar2(25) NOT NULL,
  4  V_MILEAGE       int         NOT NULL,
  5  V_GASUSED       varchar2(25)     NOT NULL,
  6  V_ELECTRICALMILES   int         NOT NULL,
  7  DRIVER_ID       varchar2(25) NOT NULL,
  8  CONSTRAINT vehicle_pk
  9  PRIMARY KEY (VIN_NUM),
 10  CONSTRAINT vehicle_fk_driver
 11  FOREIGN KEY (DRIVER_ID)
 12  REFERENCES driver (DRIVER_ID)
 13  );

Table created.

SQL>
SQL> CREATE TABLE record
  2  (
  3  RECORD_ID       varchar2(25) NOT NULL,
  4  VIN_NUM         varchar2(25)     NOT NULL,
  5  SERVER_ID       varchar2(25)     NOT NULL,
  6  CONSTRAINT record_pk
  7  PRIMARY KEY (RECORD_ID, VIN_NUM, SERVER_ID),
  8  CONSTRAINT record_fk_vehicle
  9  FOREIGN KEY (VIN_NUM)
 10  REFERENCES vehicle (VIN_NUM),
 11  CONSTRAINT record_fk_server
 12  FOREIGN KEY (SERVER_ID)
 13  REFERENCES server (SERVER_ID)
 14  );

Table created.

SQL>
SQL> CREATE TABLE application
  2  (
  3  APP_ID          varchar2(25) NOT NULL,
  4  ACCOUNT_NUM varchar2(25)     NOT NULL,
  5  RECORD_ID       varchar2(10)     NOT NULL,
  6  VERSION_ID      varchar2(10)     NOT NULL,
  7  LAST_UPDATED        date        NOT NULL,
  8  CONSTRAINT application_pk
  9  PRIMARY KEY (APP_ID)
 10  --CONSTRAINT application_fk_account
 11  --FOREIGN KEY (ACCOUNT_NUM)
 12  --REFERENCES account (ACCOUNT_NUM),
 13  --CONSTRAINT application_fk_record
 14  --FOREIGN KEY (RECORD_ID)
 15  --REFERENCES record (RECORD_ID)
 16  );

Table created.

SQL>

【讨论】:

    【解决方案2】:

    您必须在每个表定义结束后添加/ -

    CREATE TABLE server 
    (
    SERVER_ID       varchar(25) NOT NULL,
    SERVER_IP       varchar(15)     NOT NULL,
    SERVER_LOCATION     varchar(25)     NOT NULL,
    SERVER_BRAND    varchar(15)     NOT NULL,
    CONSTRAINT server_pk
    PRIMARY KEY (SERVER_ID)
    );
    /         ---->   Here
    CREATE TABLE application
    (
    APP_ID          varchar(25) NOT NULL,
    .....
    

    【讨论】:

    • 这在很大程度上取决于 OP 用于运行 SQL 语句的接口。
    • 用户标记为“sql developer”,Oracle SQL Developer 在 DDL 后不需要斜杠,仅用于 PL/SQL 编译
    • 在 SQL*Plus(以及 SQLcl 和可能的其他客户端)中,这不仅不是必需的,而且在尝试第二次执行 create 时会导致 ORA-00955 错误。 (This came up earlier...)。 SQL Developer 会忽略它(无论如何在当前版本中)。
    猜你喜欢
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    相关资源
    最近更新 更多