
اگر توسعهدهنده یا معمار پایگاه دادهی Oracle هستی، احتمالاً با خطای معروف زیر روبهرو شدهای:
ORA‑۰۱۴۰۰: cannot insert NULL into ("SCHEMA"."TABLE"."COLUMN")
این خطا یکی از رایجترین خطاهایی است که هنگام اجرای دستور INSERT یا UPDATE رخ میدهد. در واقع Oracle به شما میگوید:
در حال تلاش برای درج مقدار NULL در ستونی هستی که باید همیشه مقدار داشته باشد.
به زبان ساده، این خطا یعنی سیستم اجازه نمیدهد دادهٔ ناقص یا نامشخص وارد ستونهایی شود که با محدودیت NOT NULL تعریف شدهاند.
در این مقاله آموزش Oracle در بخش خطای های اوراکلی در مورد این خطا صحبت می کنیم.
ORA‑۰۱۴۰۰: cannot insert NULL into ("SCHEMA"."TABLE"."COLUMN")
این خطا یکی از کلاسیکترین و درعینحال مهمترین ارورهاییست که اغلب در مراحل INSERT یا UPDATE دادهها با آن مواجه میشویم.
پیشنهاد می کنم این مقاله زیر رو حتما مطالعه کنی.
در این مقاله شما می خوانید
وقتی در Oracle جدول میسازیم، معمولاً برای هر ستون مشخص میکنیم مقدار آن باید همیشه وجود داشته باشد یا خیر. مثلاً در مثال زیر:
CREATE TABLE employees (
emp_id NUMBER NOT NULL,
emp_name VARCHAR2(100) NOT NULL,
hire_date DATE,
salary NUMBER
);
ستونهای emp_id و emp_name اجباری هستند. اگر حتی یکی از آنها مقدار نگیرد، Oracle فورا خطای ORA‑۰۱۴۰۰ را صادر میکند.
این خطا دلایل متفاوتی دارد. شایعترین آنها را در جدول زیر ببین:
| علت محتمل | توضیح |
|---|---|
| فراموش کردن مقدار در دستور INSERT | در هنگام درج رکورد جدید، یکی از ستونهای اجباری مقدار ندارد. |
| متغیر NULL در PL/SQL | متغیری که باید برای ستون استفاده شود مقداردهی نشده است. |
| تابع یا سابکوئری NULL برمیگرداند | نتیجهی تابع یا زیرپرسوجو خالی است و مقدار NULL وارد میشود. |
| Trigger یا Default از کار افتاده | مقدار خودکار تولید نشده یا مکانیزم مربوطه غیرفعال است. |
| View یا Query ناقص | ستون اجباری در خروجی Query وجود ندارد و منجر به NULL میشود. |
دستور زیر را اجرا کن:
INSERT INTO employees (emp_name, hire_date, salary)
VALUES ('meisam rad', SYSDATE, 30000000);
و بهاحتمال زیاد پیام زیر را خواهی دید:
ORA‑۰۱۴۰۰: cannot insert NULL into ("HR"."EMPLOYEES"."EMP_ID")
چرا؟
چون ستون EMP_ID اجباری است (NOT NULL) اما در دستور INSERT مقدار آن ذکر نشده است.
Oracle آن را NULL در نظر میگیرد و خطا میدهد.
| وضعیت | روش رفع |
|---|---|
| ستون دارای مقدار ضروری است (Primary Key یا NOT NULL) | در دستور INSERT مقدار معتبر وارد کن یا از Sequence برای مقداردهی خودکار استفاده کن. |
| متغیر در PL/SQL مقدار NULL دارد | قبل از دستور INSERT مقداردهی انجام بده یا از NVL برای جایگزینی استفاده کن. |
| ستون دارای مقدار پیشفرض باید باشد ولی تعریف نشده | با ALTER TABLE مقدار پیشفرض مشخص کن. |
| داده از View یا Subquery میآید | بررسی کن ستون الزامی در خروجی Query موجود باشد. |
| Trigger خودکار مقدار را باید پر کند ولی کار نمیکند | بررسی کن Trigger غیرفعال نباشد و منطق داخل آن درست اجرا شود. |
CREATE SEQUENCE seq_emp_id START WITH 1 INCREMENT BY 1;
INSERT INTO employees (emp_id, emp_name, hire_date, salary)
VALUES (seq_emp_id.NEXTVAL, 'meisam raad', SYSDATE, 30000000);
در این حالت مقدار ID بهصورت خودکار تولید میشود و هیچوقت NULL نخواهیم داشت.
اگر در برنامه PL/SQL داری از متغیر استفاده میکنی، مثل مثال زیر:
DECLARE
v_empid NUMBER;
BEGIN
INSERT INTO employees (emp_id, emp_name)
VALUES (v_empid, 'Meisam Raad');
END;
این بلاک منجر به ORA‑۰۱۴۰۰ میشود، چون v_empid مقدار ندارد.
باید بهصورت درست مقداردهی شود:
DECLARE
v_empid NUMBER := seq_emp_id.NEXTVAL;
BEGIN
INSERT INTO employees (emp_id, emp_name)
VALUES (v_empid, 'Meisam Raad');
END;
SELECT column_name
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES'
AND nullable = 'N';
این Query بهسرعت همه ستونهایی که نباید مقدارشان NULL باشد را نشان میدهد.
اگر میخواهی برای یک ستون مقدار پیشفرض مشخص کنی تا هنگام INSERT خالی نماند:
ALTER TABLE employees
MODIFY salary DEFAULT 1000000;
از این پس اگر salary وارد نشود، Oracle خودکار این مقدار پیشفرض را درج میکند.
راه دیگر، استفاده از Trigger برای مقداردهی خودکار به ستونها است:
CREATE OR REPLACE TRIGGER trg_emp_id
BEFORE INSERT ON employees
FOR EACH ROW
WHEN (NEW.emp_id IS NULL)
BEGIN
:NEW.emp_id := seq_emp_id.NEXTVAL;
END;
حالا اگر کاربر مقدار emp_id را ندهد، Trigger خودش آن را میسازد.
- همیشه ستونهای Primary Key را با Sequence یا Identity بساز تا NULL نشود.
- در برنامههای APEX، هنگام دریافت این خطا معمولاً آیتمی از فرم مقدار ندارد — بررسی کن Bind Variable درست تنظیم شده باشد.
- اگر از
INSERT INTO SELECTاستفاده میکنی، مطمئن شو در SELECT مقادیر ستونهای الزامی وجود دارند. - اگر در محیطهای چندجدولی هستی (FKها)، توجه کن که مقدار NULL در کلید خارجی نیز باعث همین خطا میشود.
- برای تست سریع، از
NVL(value, default)استفاده کن تا برای مقادیر احتمالیNULL خطای ORA‑۰۱۴۰۰ رخ ندهد.
سوالات متداول درباره رفع خطای ORA‑۰۱۴۰۰ در اوراکل
خطای ORA‑۰۱۴۰۰: cannot insert NULL زمانی اتفاق میافتد که بخواهیم مقدار NULL را در ستونی درج کنیم که با شرط NOT NULL ساخته شده است.
این خطا در واقع به ما میگوید ستون موردنظر الزامی (Required) است و نباید مقدار خالی یا نامشخص دریافت کند.
معمولاً در جدولهایی که شناسه (ID) یا اطلاعات هویتی دارند این مشکل بیشتر دیده میشود.
رایجترین علتهای این خطا عبارتند از:
- فراموش کردن مقدار در دستور
INSERTیاUPDATE. - متغیرهای
NULLدر PL/SQL که مقداردهی نشدهاند. - توابع یا سابکوئریهایی که نتیجهی خالی برمیگردانند.
- Trigger یا Default تنظیمشده کار نمیکند.
- درج رکورد از طریق View یا Query ناقص که ستون الزامی را ندارد.
بررسی تعریف جدول با دستور DESC table_name یا کوئری USER_TAB_COLUMNS معمولاً سریعترین راه تشخیص ستونهای اجباری است.
سه روش استاندارد برای رفع این خطا وجود دارد:
- مقداردهی مستقیم: در دستور
INSERTهمهٔ ستونهای الزامی را مقدار بده. - استفاده از Sequence: اگر ستون شناسه داری (مثل
EMP_ID)، ازsequence_name.NEXTVALبرای تولید مقدار استفاده کن. - Trigger یا Default Value: اگر نمیخواهی در هر insert مقدار دستی وارد کنی، با
TriggerیاALTER TABLE ... DEFAULTمقدار خودکار تعریف کن.
نمونه کاربرد Trigger:
CREATE OR REPLACE TRIGGER trg_emp_id
BEFORE INSERT ON employees
FOR EACH ROW
WHEN (NEW.emp_id IS NULL)
BEGIN
:NEW.emp_id := seq_emp_id.NEXTVAL;
END;
برای پیشگیری از ORA‑۰۱۴۰۰ باید منطق دادهها را در طراحی جدول و برنامه کنترل کنی:
- تمام ستونهای ضروری را با مقدار پیشفرض یا Sequence مقداردهی کن.
- در لایهی برنامهنویسی (#APEX، C، یا PL/SQL Forms) قبل از
INSERT، مقدار متغیرها را با تابعNVL()یا بررسی null کنترل کن. - از کوئری زیر استفاده کن تا ستونهای غیرقابل null را بشناسی:
SELECT column_name FROM user_tab_columns
WHERE table_name = ‘EMPLOYEES’
AND nullable = ‘N’;
این اقدامات باعث میشود اصلاً خطای ORA‑۰۱۴۰۰ رخ ندهد و ثبات دادهها حفظ شود.
جمعبندی
| مورد | توضیح مختصر |
|---|---|
| نام خطا | ORA‑۰۱۴۰۰ |
| پیام کامل | cannot insert NULL into ("SCHEMA"."TABLE"."COLUMN") |
| مفهوم | درج مقدار NULL در ستون دارای محدودیت NOT NULL |
| نوع خطا | Constraint Violation – نقص در صحت داده |
| روش رفع کلی | درج مقدار معتبر، تعریف Default یا اصلاح Logic در PL/SQL / Trigger |
| ابزار بررسی | ALL_TAB_COLUMNS، USER_CONSTRAINTS، DBA_TAB_COLUMNS |
خطای ORA‑۰۱۴۰۰ نشانهٔ نقص داده نیست بلکه نشانهٔ درست کار کردن کنترلهای یکپارچگی در Oracle است.
برای رفع آن همیشه سه اصل را در ذهن داشته باش:
- ستون الزامی باید مقدار داشته باشد.
- مقدار NULL یعنی داده نامشخص — از آن دوری کن.
- Sequence، Trigger و Default سه دوست قدیمی برای پیشگیری از این خطا هستند.
📥 اگر سوالی داری در مورد رفع خطای ORA‑۰۱۴۰۰ در اوراکل داری، در بخش کامنتها بپرس.

دیدگاهتان را بنویسید