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错误<