ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

خطای ORA‑۰۱۴۰۰ در Oracle — دلیل درج مقدار NULL در ستون الزامی و روش رفع کامل آن

اگر توسعه‌دهنده یا معمار پایگاه داده‌ی Oracle هستی، احتمالاً با خطای معروف زیر روبه‌رو شده‌ای:

				
					ORA‑۰۱۴۰۰: cannot insert NULL into ("SCHEMA"."TABLE"."COLUMN")

				
			

این خطا یکی از رایج‌ترین خطاهایی است که هنگام اجرای دستور INSERT یا UPDATE رخ می‌دهد. در واقع Oracle به شما می‌گوید:

در حال تلاش برای درج مقدار NULL در ستونی هستی که باید همیشه مقدار داشته باشد.

به زبان ساده، این خطا یعنی سیستم اجازه نمی‌دهد دادهٔ ناقص یا نامشخص وارد ستون‌هایی شود که با محدودیت NOT NULL تعریف شده‌اند.

در این مقاله آموزش Oracle در بخش خطای های اوراکلی در مورد این خطا صحبت می کنیم.

اگر با Oracle Database کار کرده باشی، احتمالاً یکی از آشنا‌ترین پیام‌های خطا برایت این است:
				
					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) یا اطلاعات هویتی دارند این مشکل بیشتر دیده می‌شود.

رایج‌ترین علت‌های این خطا عبارتند از:

  1. فراموش کردن مقدار در دستور INSERT یا UPDATE.
  2. متغیرهای NULL در PL/SQL که مقداردهی نشده‌اند.
  3. توابع یا ساب‌کوئری‌هایی که نتیجه‌ی خالی برمی‌گردانند.
  4. Trigger یا Default تنظیم‌شده کار نمی‌کند.
  5. درج رکورد از طریق View یا Query ناقص که ستون الزامی را ندارد.

بررسی تعریف جدول با دستور DESC table_name یا کوئری USER_TAB_COLUMNS معمولاً سریع‌ترین راه تشخیص ستون‌های اجباری است.

سه روش استاندارد برای رفع این خطا وجود دارد:

  1. مقداردهی مستقیم: در دستور INSERT همهٔ ستون‌های الزامی را مقدار بده.
  2. استفاده از Sequence: اگر ستون شناسه داری (مثل EMP_ID)، از sequence_name.NEXTVAL برای تولید مقدار استفاده کن.
  3. 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 است.

برای رفع آن همیشه سه اصل را در ذهن داشته باش:

  1. ستون الزامی باید مقدار داشته باشد.
  2. مقدار NULL یعنی داده نامشخص — از آن دوری کن.
  3. Sequence، Trigger و Default سه دوست قدیمی برای پیشگیری از این خطا هستند.

📥 اگر سوالی داری در مورد رفع خطای ORA‑۰۱۴۰۰ در اوراکل داری، در بخش کامنت‌ها بپرس.

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *