আমি যখন সীমাবদ্ধতার নাম জানি না তখন কীভাবে আমি ওরাকলে একটি "নাল নট" বাধা ফেলতে পারি?


85

আমার কাছে একটি ডাটাবেস রয়েছে যার ক্ষেত্রে কোনও ক্ষেত্রের মধ্যে নুল বাধা নেই এবং আমি এই সীমাবদ্ধতাটি সরাতে চাই। জটিল কারণটি হ'ল এই সীমাবদ্ধতার একটি সিস্টেম-সংজ্ঞায়িত নাম রয়েছে এবং সেই সীমাবদ্ধতার নাম উত্পাদন সার্ভার, ইন্টিগ্রেশন সার্ভার এবং বিভিন্ন বিকাশকারী ডেটাবেসগুলির মধ্যে পৃথক। আমাদের বর্তমান প্রক্রিয়াটি পরিবর্তন স্ক্রিপ্টগুলি যাচাই করা, এবং একটি স্বয়ংক্রিয় টাস্ক লক্ষ্য ডাটাবেসের বিরুদ্ধে স্ক্যালপ্লাসের মাধ্যমে যথাযথ অনুসন্ধানগুলি কার্যকর করে, তাই আমি এমন একটি সমাধান চাই যা সরাসরি স্ক্যালপ্লাসে প্রেরণ করা যায়।

আমার নিজের ডাটাবেসে এসকিউএল এগুলি হ'ল:

alter table MYTABLE drop constraint SYS_C0044566

আমি যখন all_constraintsভিউটি জিজ্ঞাসা করি তখন আমি সীমাবদ্ধতাটি দেখতে পারি:

select * from all_constraints where table_name = 'MYTABLE'

কিন্তু আমি নিশ্চিত কিভাবে এর সাথে কাজ করা নই SEARCH_CONDITION'র LONGডাটা টাইপ বা সেরা কিভাবে পরিবর্তনশীল লাগছিল আপ বাধ্যতা আমি তার নাম জানতে পরেও মুছে দিন।

সুতরাং, আমি কীভাবে একটি পরিবর্তন স্ক্রিপ্ট তৈরি করতে পারি যা এটির নামটির পরিবর্তে যা হয় তার ভিত্তিতে এই সীমাবদ্ধতাটি ফেলে দিতে পারে?


সম্পাদনা: @ অ্যালানের উত্তরটি উত্তম, তবে আমি উদ্বিগ্ন (ওরাকল দক্ষতার অভাবে আমার) এটি যে সার্বজনীনভাবে সত্য হতে পারে না যে সিস্টেম-উত্পন্ন নাম থাকতে পারে এমন কোনও প্রতিবন্ধকতা এটির সাথে মুছে ফেলার একটি উপায়ের সাথে যুক্ত থাকতে পারে নাম না জেনে বাধা। এটা কি সত্য যে যুক্তিযুক্তরূপে এই প্রতিবন্ধকতাটি বাদ দেওয়ার সময় সিস্টেম-নামক বাধার নাম জানার এড়াতে সর্বদা উপায় থাকবে?


4
কেবল আপনার কৌতূহল মেটানোর জন্য: নট নুল বাধা কেবল ওরাকলে একমাত্র বাধা যা আপনি সীমাবদ্ধতার নাম না জেনেও মুছে ফেলতে পারেন। অন্যান্য সমস্ত সীমাবদ্ধতার প্রকারের সীমাবদ্ধতার নাম আপনার জানা দরকার।
জেফ্রি কেম্প

উত্তর:


170
alter table MYTABLE modify (MYCOLUMN null);

ওরাকল-এ, কলামের জন্য নাল নির্দিষ্ট না করা হলে নাল নয় এমন বাধা স্বয়ংক্রিয়ভাবে তৈরি হয়। অনুরূপভাবে, কলামটি নালার অনুমতি দেওয়ার জন্য পরিবর্তিত হলে এগুলি স্বয়ংক্রিয়ভাবে বাদ দেওয়া হয়।

সংশোধিত প্রশ্নটি পরিষ্কার করা : এই সমাধানটি কেবল "নাল নয়" কলামগুলির জন্য তৈরি সীমাবদ্ধতার ক্ষেত্রে প্রযোজ্য। যদি আপনি নাম উল্লেখ না করে কলাম সংজ্ঞাতে "প্রাথমিক কী" বা একটি চেক সীমাবদ্ধতা নির্দিষ্ট করে থাকেন তবে আপনি সীমাবদ্ধতার (এবং মূল কীটির জন্য সূচক) সিস্টেমের দ্বারা উত্পাদিত নামটি শেষ করবেন। এই ক্ষেত্রে, নামটি নামানোর জন্য আপনার নামটি জানতে হবে। "নাল নয়" ব্যতীত অন্য সমস্ত প্রতিবন্ধকতার জন্য আপনি কোনও নাম নির্দিষ্ট করেছেন তা নিশ্চিত করে পরিস্থিতি এড়ানোর জন্য সর্বোত্তম পরামর্শ। আপনি যদি নিজেকে এমন পরিস্থিতিতে আবিষ্কার করেন যেখানে আপনাকে এই সীমাবদ্ধতাগুলির মধ্যে একটি সাধারণভাবে ফেলে দিতে হবে, আপনার সম্ভবত পিএল / এসকিউএল এবং ডেটা-সংজ্ঞা টেবিলগুলি অবলম্বন করতে হবে।


সত্য বলে সত্যই এটি খুব ভাল বলে মনে হচ্ছে, তবে এটি অবশ্যই আমার বর্তমান কেসটি পরিচালনা করে এবং স্পষ্টতই সহজ! ওরাকল-এ এমন কোনও মামলা রয়েছে যেখানে বাধা নামটি সিস্টেম-উত্পাদিত করা যেতে পারে তবে সেইরকম সীমাবদ্ধতার নাম এড়াতে স্কেলটি লেখা যায় না?
ক্রিস ফার্মার

4
ধন্যবাদ ... দেখা যাচ্ছে যে not nullআমার স্কিমে কেবলমাত্র সীমাবদ্ধতাগুলিই আমাকে এইভাবে প্রভাবিত করতে পারে system
ক্রিস কৃষক 19


1

কেবল মনে রাখবেন, আপনি যে ক্ষেত্রটি শূন্য করতে চান তা যদি একটি প্রাথমিক কীটির অংশ হয় তবে আপনি পারবেন না। প্রাথমিক কীগুলির নাল ক্ষেত্র থাকতে পারে না।


1

ব্যবহৃত যে কোনও প্রতিবন্ধকতা আবিষ্কার করতে, নীচের কোডটি ব্যবহার করুন:

-- Set the long data type for display purposes to 500000.

SET LONG 500000

-- Define a session scope variable.

VARIABLE output CLOB

-- Query the table definition through the <code>DBMS_METADATA</code> package.

SELECT dbms_metadata.get_ddl('TABLE','[Table Described]') INTO :output FROM dual;

এটি মূলত রেফারেন্স সারণীটি কীভাবে তৈরি করা হয় তার জন্য একটি তৈরি বিবৃতি দেখায়। টেবিলটি কীভাবে তৈরি হয় তা জেনে আপনি টেবিলের সমস্ত সীমাবদ্ধতা দেখতে পাবেন।

মাইকেল ম্যাকলফ্লিনের ব্লগ থেকে নেওয়া উত্তর: http://michaelmclaughlin.info/db1/lesson-5-querying-data/lab-5-querying-data/ তার ডেটাবেস ডিজাইন আই ক্লাস থেকে।


0

বিভিন্ন মানকে অনুমোদনের জন্য আমার যে কাস্টম চেক সীমাবদ্ধতাটি আপডেট করার দরকার হয়েছিল তা ঘুরে দেখার চেষ্টা করতেও আমি একই সমস্যার মুখোমুখি হয়েছি। সমস্যাটি হ'ল ALL_CONSTRAINTS কে কোন কলামে সীমাবদ্ধতা প্রয়োগ করা হয়েছে তা বলার উপায় নেই। আমি যেভাবে এটি পরিচালনা করেছিলাম তা হল এর পরিবর্তে ALL_CONS_COLUMNS কে জিজ্ঞাসা করা, তারপরে প্রতিবন্ধকতাগুলির প্রত্যেকটির নাম বাদ দিয়ে পুনরায় তৈরি করুন।

সারণী_নাম = [TABLE_NAME] এবং কলাম_নাম = [COLUMN_NAME] যেখানে সমস্ত_ কনস_কলামগুলি থেকে সীমাবদ্ধ_নাম নির্বাচন করুন;


0

অস্থায়ী টেবিলগুলিতে কাঠামোগুলির অনুলিপিগুলি তৈরি করার সময় আমার সাথে এরকম কিছু ঘটেছিল, তাই আমি নালটিকে সরিয়ে ফেললাম।

DECLARE
   CURSOR cur_temp_not_null IS
        SELECT table_name, constraint_name  FROM all_constraints WHERE table_name LIKE 'TEMP_%' AND  owner='myUSUARIO';

   V_sql VARCHAR2(200); 

BEGIN
  FOR c_not_null IN cur_temp_not_null
   LOOP
     v_sql :='ALTER TABLE ' || c_not_null.table_name || ' DROP CONSTRAINT '|| c_not_null.constraint_name;
     EXECUTE IMMEDIATE  v_sql;     
  END LOOP;
END;

স্ট্যাক ওভারফ্লো একটি ইংরেজি কেবল সাইট। তবে স্ট্যাক ওভারফ্লো এন এস্পোওল রয়েছে । আমার সম্পাদনা দেখুন।
help-info.de

0

যদি কোনও টেবিল তৈরি করার সময় নাম ব্যতীত STATUS কলামে সীমাবদ্ধতা তৈরি করা হয়েছিল, ওরাকল এটির জন্য একটি এলোমেলো নাম নির্ধারণ করবেন। দুর্ভাগ্যক্রমে, আমরা সীমাবদ্ধতা সরাসরি সংশোধন করতে পারি না।

STATUS কলামে লিঙ্কযুক্ত নামবিহীন প্রতিবন্ধকতা ফেলে দেওয়ার সাথে জড়িত পদক্ষেপগুলি

  1. STATUS2 কে নতুন ক্ষেত্রের STATUS2 তে সদৃশ করুন
  2. STATUS2 এ CHECK সীমাবদ্ধতাগুলি নির্ধারণ করুন
  3. STATUS থেকে STATUS2 এ ডেটা স্থানান্তর করুন
  4. STATUS কলামটি ফেলে দিন
  5. STATUS2 এর নাম পরিবর্তন করুন STATUS

    ALTER TABLE MY_TABLE ADD STATUS2 NVARCHAR2(10) DEFAULT 'OPEN'; ALTER TABLE MY_TABLE ADD CONSTRAINT MY_TABLE_CHECK_STATUS CHECK (STATUS2 IN ('OPEN', 'CLOSED')); UPDATE MY_TABLE SET STATUS2 = STATUS; ALTER TABLE MY_TABLE DROP COLUMN STATUS; ALTER TABLE MY_TABLE RENAME COLUMN STATUS2 TO STATUS;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.