У меня есть 2 стола ISSUENCE
и SKLAD
.
В таблице ISSUENCE
я пытаюсь сделать запрос на вставку названия элемента из таблицы SKLAD
по его ID
. Значения, внесенные в таблицу ISSUENCE
:
ISSUE_ID, EPLOYEES_EMP_ID, SKLAD_ITEM_ID
Используемый запрос:
INSERT INTO issuence (issue_item_name)
SELECT item_name
FROM sklad, issuence
WHERE item_id = sklad_item_id;
Но я получаю эту ошибку:
ORA-01400: невозможно вставить NULL в ("SKLAD"."ISSUENCE"."ISSUE_ID")
Таблицы выглядят так:
ВЫПУСК:
СКЛАД:
Вы пытаетесь вставить NULL в ISSUE_ID, но "не можете вставить NULL в ("SKLAD"."ISSUENCE"."ISSUE_ID")". В чем, кажется, беда?
JOIN
в стандарте SQL ANSI-92 (более 30 лет назад) и его использование не рекомендуется
Вы пытаетесь вставить новые строки в таблицу ISSUENCE или обновить ISSUE_ITEM_NAME существующих строк, используя значение ITEM_NAME в таблице SKLAD?
Вы не опубликовали всю информацию об этой схеме, но, глядя на опубликованные вами скриншоты, кажется, что item_id
является первичным ключом в таблице sklad
, на которую затем ссылается столбец sklad_item_id
из issuence
. Кроме того, issue_id
, вероятно, является столбцом первичного ключа в issuence
. В данном случае не имеет значения, employees_emp_id
выглядит как еще один столбец внешнего ключа.
Поскольку вы используете 11g, столбцы первичного ключа не являются столбцами идентификаторов, и их значение не может быть сгенерировано автоматически декларативным образом. Это означает, что вам нужно либо указать значения первичного ключа при вставке строк в таблицы, либо использовать триггеры базы данных, которые сделают это.
Создайте таблицы:
SQL> create table sklad
2 (item_id integer constraint pk_sklad primary key,
3 item_name varchar2(500),
4 form_size varchar2(10),
5 item_quantity integer
6 );
Table created.
SQL> create table issuence
2 (issue_id integer constraint pk_iss primary key,
3 employees_emp_id integer not null,
4 sklad_item_id integer constraint fk_iss_sklad references sklad (item_id) not null,
5 issue_date date,
6 issue_period_days integer,
7 issue_quantity integer,
8 issue_item_name nvarchar2(200)
9 );
Table created.
Последовательность будет использоваться для столбцов первичного ключа:
SQL> create sequence seq_is;
Sequence created.
Пример sklad
ряда:
SQL> insert into sklad (item_id, item_name) values (seq_is.nextval, 'Some name');
1 row created.
Вот где вы получили ошибку: вы должны предоставить значения столбцам NOT NULL
, так или иначе (триггер или вручную). Вот пример:
SQL> insert into issuence (issue_id, employees_emp_id, sklad_item_id)
2 select seq_is.nextval, 100, s.item_id
3 from sklad s
4 where s.item_id = (select min(a.item_id)
5 from sklad a);
1 row created.
SQL> select * from issuence;
ISSUE_ID EMPLOYEES_EMP_ID SKLAD_ITEM_ID ISSUE_DATE ISSUE_PERIOD_DAYS ISSUE_QUANTITY ISSUE_ITEM
---------- ---------------- ------------- ---------- ----------------- -------------- ----------
2 100 1
SQL>
Привет - что насчет сообщения об ошибке вам неясно? Если вы посмотрите на определение таблицы, вы увидите, какие столбцы не могут быть обнулены.