在 Oracle Database 11g SQL 中创建 table 时出错
Error when creating table in Oracle Database 11g SQL
我是 SQL 的新手,我正在尝试创建一个新的 table 但是当我在 SQL 中 运行 我的脚本时出现错误命令行,我得到的错误是 ORA-00942 缺少右括号或 ORA-00942 table 或视图不存在。
哦,是的,我知道我可能写了一些糟糕的脚本,但如前所述,我正在学习,所以任何有意义的批评和一些帮助都将不胜感激:)。
CREATE TABLE Branch
(
Branch_ID varchar(5),
Branch_Name varchar(255),
Branch_Address varchar(255),
Branch_Town varchar(255),
Branch_Postcode varchar(10),
Branch_Phone varchar(50),
Branch_Fax varchar(50),
Branch_Email varchar(50),
Property_ID varchar(5),
Contract_ID varchar(5),
Staff_ID varchar(5),
PRIMARY KEY (Branch_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_Id),
FOREIGN KEY (Contract_ID) REFERENCES Contract(Contract_Id),
FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_Id)
);
CREATE TABLE Staff
(
Staff_ID varchar(5),
Staff_Forename varchar(255),
Staff_Surname varchar(255),
Staff_Address varchar(255),
Staff_Town varchar(255)
Staff_Postcode varchar(10),
Staff_Phone varchar(50),
Staff_DOB varchar(50),
Staff_NIN varchar(10),
Staff_Salary varchar(50),
Staff_Date_Joined varchar(100),
Staff_Viewing_Arranged varchar(100),
Branch_ID varchar(5),
Sales_ID varchar(5),
PRIMARY KEY (Staff_ID),
FOREIGN KEY (Branch_ID) REFERENCES Branch(Branch_ID),
FOREIGN KEY (Sales_ID) REFERENCES Sales(Sales_Id)
);
CREATE TABLE Sales
(
Sales_ID varchar(5),
Property_Address varchar(255),
Property_Town varchar(255)
Property_Postcode varchar(10),
Property_Type varchar(255),
Num_Rooms varchar(50),
Date_of_Sale varchar(10),
Sales_Bonus varchar(100),
Branch_ID varchar(5),
Property_ID varchar(5),
Staff_ID varchar(5)
Seller_ID varchar(5),
PRIMARY KEY (Sales_ID),
FOREIGN KEY (Branch_ID) REFERENCES Branch(Branch_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_Id),
FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_Id),
FOREIGN KEY (Seller_ID) REFERENCES Seller(Seller_Id)
);
CREATE TABLE Contract
(
Contract_ID varchar(5),
Contract_Signed_Date varchar(50),
Property_ID varchar(5),
Buyer_ID varchar(5),
Seller_ID varchar(5),
Branch_ID varchar(5),
PRIMARY KEY (Contract_ID),
FOREIGN KEY (Branch_ID) REFERENCES Branch(Branch_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_Id),
FOREIGN KEY (Seller_ID) REFERENCES Seller(Seller_Id),
FOREIGN KEY (Buyer_ID) REFERENCES Buyer(Buyer_Id)
);
CREATE TABLE Buyer
(
Buyer_ID varchar(5),
Viewing_Data varchar(255),
Maximum_Budject varchar(255),
Purchase_Price varchar (50),
Buyer_Forename varchar(255),
Buyer_Surname varchar(255),
Buyer_Address varchar(255),
Buyer_Town varchar(255),
Buyer_Postcode varchar(10),
Property_ID varchar(5),
Contract_ID varchar(5),
Survey_ID varchar(5),
PRIMARY KEY (Buyer_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_ID),
FOREIGN KEY (Contract_ID) REFERENCES Contract(Contract_Id),
FOREIGN KEY (Survey_ID) REFERENCES Survey(Survey_Id)
);
CREATE TABLE Seller
(
Seller_ID varchar(5),
Seller_Forename varchar(255),
Seller_Surname varchar(255),
Seller_Address varchar(255),
Seller_Town varchar(255),
Seller_Postcode varchar(10),
Seller_Property_ID varchar(5),
No_of_Bed varchar(5),
Contract_ID varchar(5),
Property_ID varchar(5),
Sales_ID varchar(5),
PRIMARY KEY (Seller_ID),
FOREIGN KEY (Contract_ID) REFERENCES Contract(Contract_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_Id),
FOREIGN KEY (Sales_ID) REFERENCES Sales(Sales_Id)
);
CREATE TABLE Property
(
Property_ID varchar(5),
Property_Address varchar(255),
Property_Town varchar(255),
Property_Postcode varchar(10),
Asking_Price varchar(20),
Date_Registered varchar(50),
Property_Fixtures varchar(255),
Size_of_Rooms varchar(100),
Buyer_ID varchar(5),
Staff_ID varchar(5),
Contract_ID varchar(5),
Seller_ID varchar(5),
PRIMARY KEY (Property_ID),
FOREIGN KEY (Buyer_ID) REFERENCES Buyer(Buyer_ID),
FOREIGN KEY (Seller_ID) REFERENCES Seller(Seller_ID),
FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_Id),
FOREIGN KEY (Contract_ID) REFERENCES Contract(Contract_Id)
);
CREATE TABLE Survey
(
Survey_ID varchar(5),
No_of_Survey varchar(10),
Survey_Type varchar(255),
Organised_By varchar(255),
Property_ID varchar(5),
Staff_ID varchar(5),
Buyer_ID varchar(5),
PRIMARY KEY (Survey_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_ID),
FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_Id),
FOREIGN KEY (Buyer_ID) REFERENCES Buyer(Buyer_Id)
);
CREATE TABLE Advert
(
Survey_ID Advert_ID varchar(5),
No_of_Adverts varchar(10),
Advert_Website varchar(255),
Advert_Newspaper varchar(255),
Property_ID varchar(5),
PRIMARY KEY (Advert_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_ID)
);
STAFF
Table最后漏了一个,
Staff_Town varchar(255)
Sales
Table 也是
Property_Town varchar(255)
Staff_ID varchar(5)
此外,您不能定义对table尚未创建的约束。我可以找到删除这些约束的错误。
在创建所引用的 table 之前无法定义外键引用。所以,如果外键引用是循环的,在 A => B => C => A 中,你首先必须创建 tables,然后使用 ALTER TABLE 来定义外键键。否则,按顺序创建 table,首先创建 table,然后创建引用它的 table。
您的脚本引用了尚未创建的表。即,查看您的第一个 create table
。到那时,STAFF
和其他表还不存在,但您将它们设置为外键引用。
你应该先创建你的表,然后在依赖关系到位后应用约束,使用 alter
:
ALTER TABLE BRANCH
ADD CONSTRAINT fk_staff_id
FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_Id);
因为您有相互引用的表,所以您需要在创建表之后创建引用
--create table Buyer
CREATE TABLE Buyer
(
Buyer_ID varchar(5),
Property_ID varchar(5),
PRIMARY KEY (Buyer_ID)
);
--create table Property
CREATE TABLE Property
(
Property_ID varchar(5),
Buyer_ID varchar(5),
PRIMARY KEY (Property_ID)
);
--now you can set your reference constraints
ALTER TABLE Property Add FOREIGN KEY (Buyer_ID) REFERENCES Buyer(Buyer_ID);
ALTER TABLE Buyer Add FOREIGN KEY (Property_ID) REFERENCES Property(Property_ID);
您的按键语法不清晰。
下面是使用主键和外键 (fk) 创建 table 的示例:
CREATE TABLE animals (
animal_id NUMBER(10) PRIMARY KEY,
animal_name VARCHAR2(50) NOT NULL,
animal_species_code NUMBER(50) NOT NULL
CONSTRAINT fk_animal_species REFERENCES animal_species
(species_code));
看起来这组 table 中的建模可能会受益于一些添加和更改。
例如,STAFF table 引用了 BRANCH table - 但 BRANCH 也引用了 STAFF。这意味着 BRANCH 只能引用一个 STAFF,反之亦然,我怀疑这不是我们想要的。看起来您想要 BRANCH 和 STAFF 之间的多对多关系,启用此关系的标准解决方案是连接 table - 一个包含两个 table 的主键的连接。 BRANCH 和 STAFF 之间的这种连接 table 可能看起来像:
CREATE TABLE BRANCH_STAFF
(BRANCH_ID VARCHAR(5)
CONSTRAINT BRANCH_STAFF_FK1
REFERENCES BRANCH(BRANCH_ID),
STAFF_ID VARCHAR(5)
CONSTRAINT BRANCH_STAFF_FK2
REFERENCES STAFF(STAFF_ID),
CONSTRAINT PK_BRANCH_STAFF
PRIMARY KEY (BRANCH_ID, STAFF_ID)
USING INDEX);
祝你好运。
我是 SQL 的新手,我正在尝试创建一个新的 table 但是当我在 SQL 中 运行 我的脚本时出现错误命令行,我得到的错误是 ORA-00942 缺少右括号或 ORA-00942 table 或视图不存在。
哦,是的,我知道我可能写了一些糟糕的脚本,但如前所述,我正在学习,所以任何有意义的批评和一些帮助都将不胜感激:)。
CREATE TABLE Branch
(
Branch_ID varchar(5),
Branch_Name varchar(255),
Branch_Address varchar(255),
Branch_Town varchar(255),
Branch_Postcode varchar(10),
Branch_Phone varchar(50),
Branch_Fax varchar(50),
Branch_Email varchar(50),
Property_ID varchar(5),
Contract_ID varchar(5),
Staff_ID varchar(5),
PRIMARY KEY (Branch_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_Id),
FOREIGN KEY (Contract_ID) REFERENCES Contract(Contract_Id),
FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_Id)
);
CREATE TABLE Staff
(
Staff_ID varchar(5),
Staff_Forename varchar(255),
Staff_Surname varchar(255),
Staff_Address varchar(255),
Staff_Town varchar(255)
Staff_Postcode varchar(10),
Staff_Phone varchar(50),
Staff_DOB varchar(50),
Staff_NIN varchar(10),
Staff_Salary varchar(50),
Staff_Date_Joined varchar(100),
Staff_Viewing_Arranged varchar(100),
Branch_ID varchar(5),
Sales_ID varchar(5),
PRIMARY KEY (Staff_ID),
FOREIGN KEY (Branch_ID) REFERENCES Branch(Branch_ID),
FOREIGN KEY (Sales_ID) REFERENCES Sales(Sales_Id)
);
CREATE TABLE Sales
(
Sales_ID varchar(5),
Property_Address varchar(255),
Property_Town varchar(255)
Property_Postcode varchar(10),
Property_Type varchar(255),
Num_Rooms varchar(50),
Date_of_Sale varchar(10),
Sales_Bonus varchar(100),
Branch_ID varchar(5),
Property_ID varchar(5),
Staff_ID varchar(5)
Seller_ID varchar(5),
PRIMARY KEY (Sales_ID),
FOREIGN KEY (Branch_ID) REFERENCES Branch(Branch_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_Id),
FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_Id),
FOREIGN KEY (Seller_ID) REFERENCES Seller(Seller_Id)
);
CREATE TABLE Contract
(
Contract_ID varchar(5),
Contract_Signed_Date varchar(50),
Property_ID varchar(5),
Buyer_ID varchar(5),
Seller_ID varchar(5),
Branch_ID varchar(5),
PRIMARY KEY (Contract_ID),
FOREIGN KEY (Branch_ID) REFERENCES Branch(Branch_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_Id),
FOREIGN KEY (Seller_ID) REFERENCES Seller(Seller_Id),
FOREIGN KEY (Buyer_ID) REFERENCES Buyer(Buyer_Id)
);
CREATE TABLE Buyer
(
Buyer_ID varchar(5),
Viewing_Data varchar(255),
Maximum_Budject varchar(255),
Purchase_Price varchar (50),
Buyer_Forename varchar(255),
Buyer_Surname varchar(255),
Buyer_Address varchar(255),
Buyer_Town varchar(255),
Buyer_Postcode varchar(10),
Property_ID varchar(5),
Contract_ID varchar(5),
Survey_ID varchar(5),
PRIMARY KEY (Buyer_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_ID),
FOREIGN KEY (Contract_ID) REFERENCES Contract(Contract_Id),
FOREIGN KEY (Survey_ID) REFERENCES Survey(Survey_Id)
);
CREATE TABLE Seller
(
Seller_ID varchar(5),
Seller_Forename varchar(255),
Seller_Surname varchar(255),
Seller_Address varchar(255),
Seller_Town varchar(255),
Seller_Postcode varchar(10),
Seller_Property_ID varchar(5),
No_of_Bed varchar(5),
Contract_ID varchar(5),
Property_ID varchar(5),
Sales_ID varchar(5),
PRIMARY KEY (Seller_ID),
FOREIGN KEY (Contract_ID) REFERENCES Contract(Contract_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_Id),
FOREIGN KEY (Sales_ID) REFERENCES Sales(Sales_Id)
);
CREATE TABLE Property
(
Property_ID varchar(5),
Property_Address varchar(255),
Property_Town varchar(255),
Property_Postcode varchar(10),
Asking_Price varchar(20),
Date_Registered varchar(50),
Property_Fixtures varchar(255),
Size_of_Rooms varchar(100),
Buyer_ID varchar(5),
Staff_ID varchar(5),
Contract_ID varchar(5),
Seller_ID varchar(5),
PRIMARY KEY (Property_ID),
FOREIGN KEY (Buyer_ID) REFERENCES Buyer(Buyer_ID),
FOREIGN KEY (Seller_ID) REFERENCES Seller(Seller_ID),
FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_Id),
FOREIGN KEY (Contract_ID) REFERENCES Contract(Contract_Id)
);
CREATE TABLE Survey
(
Survey_ID varchar(5),
No_of_Survey varchar(10),
Survey_Type varchar(255),
Organised_By varchar(255),
Property_ID varchar(5),
Staff_ID varchar(5),
Buyer_ID varchar(5),
PRIMARY KEY (Survey_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_ID),
FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_Id),
FOREIGN KEY (Buyer_ID) REFERENCES Buyer(Buyer_Id)
);
CREATE TABLE Advert
(
Survey_ID Advert_ID varchar(5),
No_of_Adverts varchar(10),
Advert_Website varchar(255),
Advert_Newspaper varchar(255),
Property_ID varchar(5),
PRIMARY KEY (Advert_ID),
FOREIGN KEY (Property_ID) REFERENCES Property(Property_ID)
);
STAFF
Table最后漏了一个,
Staff_Town varchar(255)
Sales
Table 也是
Property_Town varchar(255)
Staff_ID varchar(5)
此外,您不能定义对table尚未创建的约束。我可以找到删除这些约束的错误。
在创建所引用的 table 之前无法定义外键引用。所以,如果外键引用是循环的,在 A => B => C => A 中,你首先必须创建 tables,然后使用 ALTER TABLE 来定义外键键。否则,按顺序创建 table,首先创建 table,然后创建引用它的 table。
您的脚本引用了尚未创建的表。即,查看您的第一个 create table
。到那时,STAFF
和其他表还不存在,但您将它们设置为外键引用。
你应该先创建你的表,然后在依赖关系到位后应用约束,使用 alter
:
ALTER TABLE BRANCH
ADD CONSTRAINT fk_staff_id
FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_Id);
因为您有相互引用的表,所以您需要在创建表之后创建引用
--create table Buyer
CREATE TABLE Buyer
(
Buyer_ID varchar(5),
Property_ID varchar(5),
PRIMARY KEY (Buyer_ID)
);
--create table Property
CREATE TABLE Property
(
Property_ID varchar(5),
Buyer_ID varchar(5),
PRIMARY KEY (Property_ID)
);
--now you can set your reference constraints
ALTER TABLE Property Add FOREIGN KEY (Buyer_ID) REFERENCES Buyer(Buyer_ID);
ALTER TABLE Buyer Add FOREIGN KEY (Property_ID) REFERENCES Property(Property_ID);
您的按键语法不清晰。
下面是使用主键和外键 (fk) 创建 table 的示例:
CREATE TABLE animals (
animal_id NUMBER(10) PRIMARY KEY,
animal_name VARCHAR2(50) NOT NULL,
animal_species_code NUMBER(50) NOT NULL
CONSTRAINT fk_animal_species REFERENCES animal_species
(species_code));
看起来这组 table 中的建模可能会受益于一些添加和更改。
例如,STAFF table 引用了 BRANCH table - 但 BRANCH 也引用了 STAFF。这意味着 BRANCH 只能引用一个 STAFF,反之亦然,我怀疑这不是我们想要的。看起来您想要 BRANCH 和 STAFF 之间的多对多关系,启用此关系的标准解决方案是连接 table - 一个包含两个 table 的主键的连接。 BRANCH 和 STAFF 之间的这种连接 table 可能看起来像:
CREATE TABLE BRANCH_STAFF
(BRANCH_ID VARCHAR(5)
CONSTRAINT BRANCH_STAFF_FK1
REFERENCES BRANCH(BRANCH_ID),
STAFF_ID VARCHAR(5)
CONSTRAINT BRANCH_STAFF_FK2
REFERENCES STAFF(STAFF_ID),
CONSTRAINT PK_BRANCH_STAFF
PRIMARY KEY (BRANCH_ID, STAFF_ID)
USING INDEX);
祝你好运。