Как создать эту таблицу в ORACLE SQL без ошибок? - PullRequest
0 голосов
/ 28 октября 2018

Попытка создать следующие две таблицы в базе данных ORACLE SQL, однако получает ORA-00904. Первая таблица создает штраф, однако вторая отказывается сотрудничать и потерпела неудачу в первой строке. Был бы благодарен за любые идеи?

CREATE TABLE ORDERS
(ORDER_NUMBER VARCHAR(4),
ORDER_DATE DATE CONSTRAINT ORDER_ORDER_DATE_NN NOT NULL,
CUSTOMER_NAME VARCHAR(50) CONSTRAINT ORDER_CUSTOMER_NAME_NN NOT NULL,
POSTAGE NUMBER(4,2) CONSTRAINT ORDER_POSTAGE_NN NOT NULL,
ORDER_TOTAL NUMBER(8,2),
 CONSTRAINT ORDER_NUM_PK PRIMARY KEY (ORDER_NUMBER)
 );



CREATE TABLE ITEMS
(ITEM_NUMBER VARCHAR(3),
ITEM_DESCRIPTION VARCHAR(500) CONSTRAINT ITEMS_ITEM_DESCRIPTION_NN NOT NULL, 
SIZE VARCHAR(1) CONSTRAINT ITEMS_SIZE_NN NOT NULL, 
COST NUMBER(4,2) CONSTRAINT ITEMS_COST_NN NOT NULL,
QUANTITY NUMBER(4) CONSTRAINT ITEMS_QUANTITY_NN NOT NULL, 
ORDER_NUMBER NUMBER(5),
    CONSTRAINT ITEM_ITEM_NUM_PK PRIMARY KEY (ITEM_NUMBER),
    CONSTRAINT ITEM_ORDER_NUM_FK FOREIGN KEY (ORDER_NUMBER)
        REFERENCES ORDERS (ORDER_NUMBER),
);

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Моя версия будет выглядеть так:

create table orders
( order_number       varchar2(4) constraint order_num_pk primary key
, order_date         date not null
, customer_name      varchar2(50) not null
, postage            number(4,2) not null
, order_total        number(8,2)
);

create table items
( item_number        varchar2(3) constraint item_item_num_pk primary key
, item_description   varchar2(500) not null
, order_number       constraint item_order_num_fk references orders (order_number)
, item_size          varchar2(1) not null
, cost               number(4,2) not null
, quantity           number(4) not null
);
  • Хотя полезно давать явные имена первичным, уникальным и (возможно) внешним ключам, именование ограничений NOT NULL обычно считается излишним.
  • Определение ограничений для одного столбца, встроенных в определение столбца, является менее многословным, а также позволяет столбцам FK наследовать тип данных столбца, на который ссылаются, что я лично считаю лучшей практикой.
  • Определение столбцов с "числом" вимя, которое на самом деле не является числом, кажется, вызывает проблемы, но это ваша модель данных.
  • «ПУНКТЫ» могут быть неоднозначными, если у вас есть как товары для инвентаря, так и товары для заказа, но опять же, это ваше дело.
  • SIZE является частью синтаксиса CREATE CLUSTER и поэтому не допускается в качестве имени столбца.Вы можете назвать это "SIZE" (двойные кавычки), но вам придется обращаться к нему таким образом каждый раз, всегда, поэтому я использовал вместо него item_size.
  • Я кодирую строчными буквами, потому что это не COBOLи это не 1974 год.
0 голосов
/ 28 октября 2018

Вы можете использовать следующее:

CREATE TABLE ORDERS
(
  ORDER_NUMBER NUMBER(5),
  ORDER_DATE DATE CONSTRAINT ORDER_ORDER_DATE_NN NOT NULL,
  CUSTOMER_NAME VARCHAR(50) CONSTRAINT ORDER_CUSTOMER_NAME_NN NOT NULL,
  POSTAGE NUMBER(4,2) CONSTRAINT ORDER_POSTAGE_NN NOT NULL,
  ORDER_TOTAL NUMBER(8,2),
  CONSTRAINT ORDER_NUM_PK PRIMARY KEY (ORDER_NUMBER)
);

CREATE TABLE ITEMS
(
  ITEM_NUMBER VARCHAR2(3),
  ITEM_DESCRIPTION VARCHAR(500) CONSTRAINT ITEMS_ITEM_DESCRIPTION_NN NOT NULL, 
  "SIZE" VARCHAR2(1) CONSTRAINT ITEMS_SIZE_NN NOT NULL, 
  COST NUMBER(4,2) CONSTRAINT ITEMS_COST_NN NOT NULL,
  QUANTITY NUMBER(4) CONSTRAINT ITEMS_QUANTITY_NN NOT NULL, 
  ORDER_NUMBER NUMBER(5),
  CONSTRAINT ITEM_ITEM_NUM_PK PRIMARY KEY (ITEM_NUMBER),
  CONSTRAINT ITEM_ORDER_NUM_FK FOREIGN KEY (ORDER_NUMBER)
        REFERENCES ORDERS (ORDER_NUMBER)
);
  • Ссылочные столбцы (ORDER_NUMBER) должны быть одного типа.Делаете ли вы оба типа NUMBER или VARCHAR2(4).( Я предлагаю сохранять в качестве типа NUMBER, если оба значения для обоих столбцов полностью состоят из числовых значений. Поскольку управление значением NUMBER лучше, чем значение STRING. )
  • SIZE является зарезервированнымключевое слово.Поэтому преобразуйте это имя в правильное, например "SIZE" или SIZE_ и т. Д.
  • Есть дополнительная запятая, которую необходимо удалить непосредственно перед окончанием CREATE TABLE ITEMS' скобка

  • с использованием VARCHAR2 для переменной строкового типа вместо VARCHAR предлагается Oracle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...