Sql 需要修改哪项声明?

Sql 需要修改哪项声明?,sql,oracle,Sql,Oracle,我试图创建几个表,但只创建了服务器表。请修理我的工作 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

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

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

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

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,
.....

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

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,
.....

这里有几个问题

您应该按照与外键约束依赖项匹配的顺序创建表,也就是说,您不能先创建详细表,然后再创建其主表,因为没有要引用的表(或其主键)

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

如果两个表相互引用(例如
driver
account
do),并且有很好的理由这样做,则没有问题。然而,正如我之前所说的,您不能在
createtable
语句中执行它;必须至少移出一个外键

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

  • account
    的主键是(
    account\u num,driver\u id
  • driver
    的外键不能只是(
    account\u num
    )-它还必须包含
    driver\u id
最后,
application
table:无法创建其外键,因为它引用了

  • account
    表,其主键是(
    account\u num,driver\u id
    ),但-
    application
    根本不包含
    driver\u id
    列,这可能意味着您错误地设置了
    account
    的主键(或
    application
    表)
  • record
    表中有一个复合主键(
    record\u id,vin\u num,server\u id
    ),而
    应用程序
    只有
    record\u id
    。我为
    账户写的评论在这里也有效

现在,如果我们解决了我提到的问题,那么就创建了表,但是
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>

这里有几个问题

您应该按照与外键约束依赖项匹配的顺序创建表,也就是说,您不能先创建详细表,然后再创建其主表,因为没有要引用的表(或其主键)

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

如果两个表相互引用(例如
driver
account
do),并且有很好的理由这样做,则没有问题。然而,正如我之前所说的,您不能在
createtable
语句中执行它;必须至少移出一个外键

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

  • account
    的主键是(
    account\u num,driver\u id
  • driver
    的外键不能只是(
    account\u num
    )-它还必须包含
    driver\u id
最后,
application
table:无法创建其外键,因为它引用了

  • account
    表,其主键是(
    account\u num,driver\u id
    ),但-
    application
    根本不包含
    driver\u id
    列,这可能意味着您错误地设置了
    account
    的主键(或
    application
    表)
  • record
    表中有一个复合主键(
    record\u id,vin\u num,server\u id
    ),而
    应用程序
    只有
    record\u id
    。我为
    账户写的评论在这里也有效

现在,如果我们解决了我提到的问题,那么就创建了表,但是
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>

您遇到了哪个错误?您的架构看起来不正确。例如,表
account
driver
相互引用。
引用account(account\u NUM)
-account\u NUM不是account表上的“键”。我收到了错误报告-ORA-00942:表或视图不存在00942。00000-“表或视图不存在”*原因:*操作:请不要在oracle中使用VARCHAR,而是使用VARCHAR2您遇到了什么错误?您的架构看起来不正确。例如,表
account
driver
相互引用。
引用account(account\u NUM)
-account\u NUM不是account表上的“键”。我收到了错误报告-ORA-00942:表或视图不存在00942。00000-“表或视图不存在”*原因:*操作:请不要在oracle中使用VARCHAR,而是使用VARCHAR2这在很大程度上取决于OP用于运行SQL语句的接口。标记为“SQL developer”的用户和oracle SQL developer不需要在DDL后加斜杠,仅适用于SQL*Plus中的PL/SQL编译器(以及SQLcl和可能的其他客户端)这不仅是不必要的,而且在第二次尝试执行
create
时会导致ORA-00955错误。(。SQL Developer忽略它(无论如何,在当前版本中)。这在很大程度上取决于OP用于运行SQL语句的接口。用户标记为“SQL developer”和Oracle SQL developer不需要在DDL后加斜杠,仅用于SQL*Plus中的PL/SQL编译器(以及SQLcl和可能的其他客户端),这不仅是不必要的,而且在尝试执行SQL语句时会导致ORA-00955错误<