ORA-00904: ошибка недопустимого идентификатора при создании внешнего ключа в таблице Sales_Invoice

#oracle

Вопрос:

 CREATE TABLE Car (Car_ID int PRIMARY KEY,
Serial_Number int, Make VARCHAR(255),
Model VARCHAR(255), Colour VARCHAR(255),
Year int, Car_for_Sale_Y_N VARCHAR (25));   


CREATE TABLE Salesperson 
(Salesperson_ID int primary KEY, 
Last_Name VARCHAR (255), 
First_Name VARCHAR (255));

    
CREATE TABLE Customer 
(Customer_ID int PRIMARY KEY, 
Last_Name VARCHAR (255),
First_Name VARCHAR(255), 
Phone_Number VARCHAR(255), 
Address VARCHAR (255), 
City VARCHAR(255), 
STATE_PROVINCE VARCHAR (255), 
Country VARCHAR (255), 
Postal_Code VARCHAR (255));

    
CREATE TABLE Sales_Invoice 
(Invoice_ID int PRIMARY KEY, Invoice_Number VARCHAR (255), 
Date DATE, 
Car_ID int FOREIGN KEY REFERENCES Car(Car_ID), 
Customer_ID int FOREIGN KEY REFERENCES Customer(Customer_ID));
 

Вывод: ORA-00904: : неверный идентификатор

Пожалуйста, помогите, что здесь не так, это не работает. В таблице Sales_invoice, когда я создаю внешние ключи, отображается ошибка, в чем проблема.

Комментарии:

1. Пожалуйста, отметьте только одну СУБД — не 3! Ошибки Oracle специфичны для Oracle, они не передаются другим базам данных.

2. Переименуйте поле «Дата» во что-нибудь другое и проверьте его еще раз!

Ответ №1:

Несколько предложений, если позволите.

  • не используйте varchar , но varchar2 введите данные. Почему? Oracle рекомендует так
    • вы ведь не один из моих переодетых коллег, не так ли? Их varchar2 колонки-это все (255) , так что они уверены, что большая часть информации, которую они туда помещают, подойдет. Но тебе действительно это нужно? Почтовый индекс длиной 255 символов? Ну же, один, будь серьезен!
  • назовите все свои ограничения. Если вы этого не сделаете, Oracle создаст имя по умолчанию, которое выглядит так, как будто SYS_C007858 вы понятия не имеете, что это такое на самом деле. Но, если его имя , например pk_car ,, вы будете знать, что это первичный ключ в car таблице
  • как было отмечено, date зарезервировано для типа данных, вы не можете использовать его в качестве имени столбца (хорошо, вы можете, если заключите его в двойные кавычки, но вы не должны).

Окончательно:

 SQL> create table car
  2    (car_id           int constraint pk_car primary key,
  3     serial_number    int,
  4     make             varchar2(255),
  5     model            varchar2(255),
  6     colour           varchar2(255),
  7     year             int,
  8     car_for_sale_y_n varchar2 (25));

Table created.

SQL> create table salesperson
  2  (salesperson_id int constraint pk_salesper primary key,
  3   last_name      varchar2(255),
  4   first_name     varchar2(255));

Table created.

SQL> create table customer
  2  (customer_id    int constraint pk_cust primary key,
  3   last_name      varchar2 (255),
  4   first_name     varchar2(255),
  5   phone_number   varchar2(255),
  6   address        varchar2(255),
  7   city           varchar2(255),
  8   state_province varchar2(255),
  9   country        varchar2(255),
 10   postal_code    varchar2(255));

Table created.

SQL> create table sales_invoice
  2  (invoice_id     int constraint pk_salinv primary key,
  3   invoice_number varchar2 (255),
  4   datum          date,
  5   car_id         int constraint fk_salinv_car references car(car_id),
  6   customer_id    int constraint fk_salinv_cust references customer(customer_id));

Table created.

SQL>