আমি কীভাবে ডেটা অনুলিপি না করে ওরাকল টেবিলের একটি অনুলিপি তৈরি করতে পারি?


উত্তর:


420

কেবল এমন একটি ক্লজ ব্যবহার করুন যা কোনও সারি নির্বাচন করবে না:

create table xyz_new as select * from xyz where 1=0;

সীমাবদ্ধতা

নিম্নলিখিত জিনিসগুলি নতুন টেবিলটিতে অনুলিপি করা হবে না:

  • সিকোয়েন্স
  • ট্রিগার
  • ইনডেক্স
  • কিছু বাধা অনুলিপি করা হতে পারে
  • বস্তুগত দর্শন লগ

এটি পার্টিশনগুলি পরিচালনা করে না



53
এটি একটি দুর্দান্ত, পরিষ্কার উত্তর। কেবল মনে করিয়ে দিতে চাই যে এতে কোনও বাধা অন্তর্ভুক্ত হবে না .. নতুন টেবিলের এমনকি একটি প্রাথমিক কী থাকবে না।
জোসেফস্টাইন্স 15

18
এটি অনুক্রমের প্রতিলিপি তৈরি করবে না বা ট্রিগারও করবে না।
ব্রাঞ্চগাব্রিয়েল

16
বা নতুন টেবিলটির কোনও সূচক থাকবে না - নতুন টেবিলে একটি বড় প্রশ্ন করার চেষ্টা করে ধরা
পড়বেন না

8
এছাড়াও পার্টিশন পরিচালনা করে না। তবে আরে।
এমকে

17
শুধু একটি সংযোজন - এটা হবে ধারণ কিছু সীমাবদ্ধতা - অর্থাৎ কোনো না শূন্য সীমাবদ্ধতার কপি করা হবে।
জেফ্রি কেম্প

84

আপনি যে পদ্ধতিটি অনেকটা গ্রহণ করেছেন আমি তা ব্যবহার করেছি, তবে কেউ উল্লেখ করেছেন যে এটি সীমাবদ্ধতার সদৃশ হয় না (আমি মনে করি না NULL ব্যতীত)।

আপনি যদি পুরো কাঠামোর সদৃশ করতে চান তবে আরও উন্নত পদ্ধতিটি হ'ল:

SET LONG 5000
SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME' ) FROM DUAL;

এটি আপনাকে সম্পূর্ণ তৈরি বিবৃতি পাঠ্য দেবে যা আপনি নতুন সারণী তৈরির জন্য যেমন চান তেমন পরিবর্তন করতে পারবেন। আপনাকে টেবিলের নাম এবং অবশ্যই সমস্ত সীমাবদ্ধতা পরিবর্তন করতে হবে।

(আপনি এক্সপি / আইএমপি ব্যবহার করে পুরানো সংস্করণগুলিতে এটি করতেও পারেন তবে এটি এখন অনেক সহজ)

আপনি যে টেবিলটি পরে রয়েছেন তা অন্য কোনও স্কিমাতে যুক্ত করার জন্য সম্পাদিত :

SELECT dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ) FROM DUAL;

আমি অন্য স্কিমা থেকে অনুলিপি করতে চাইলে এই আদেশটি কীভাবে সংশোধিত হতে চলেছে।
কুশলভম

My_table_nameবিদ্যমান টেবিল হয়। তবে আমি কীভাবে আমার নতুন টেবিলটির নাম তৈরি করব?
কুশলভম

আমার উত্তরের আদেশটি নতুন সারণী তৈরি করে না; এটি আপনার মূল টেবিলটি পুনরায় তৈরি করতে ব্যবহৃত এসকিউএল ফেরত দেয়। আপনি এটিকে ইচ্ছামত পরিবর্তন করেছেন এবং এটি চালান। নতুন সারণির নাম আপনি যা নির্দিষ্ট করে তা বেছে নিন।
ডেভ কোস্টা

5
সুতরাং এটি অবশ্যই ভেরিয়েবলের উপরের এসকিএল কমান্ডটি দেওয়ার মতো হবে be ryt? যেমন new_table = dbms_metadata.get_ddl( 'TABLE', 'MY_TABLE_NAME', 'OTHER_SCHEMA_NAME' ). এদিকে দয়া করে আমাকে জানান যে লং এখানে কী করে।
কুশলভম

15

এসকিএল বিকাশকারী ব্যবহার করে টেবিলটি নির্বাচন করুন এবং ডিডিএল ট্যাবে ক্লিক করুন

আপনি যখন কোনও স্কেল ওয়ার্কশিটে চালনা করেন তখন কোনও ডাটা ছাড়াই একটি নতুন টেবিল তৈরি করতে আপনি সেই কোডটি ব্যবহার করতে পারেন

স্ক্লাডেওলফারটি ওরাকল থেকে অ্যাপ্লিকেশন ব্যবহারের জন্য নিখরচায়।

যদি টেবিলটিতে সিকোয়েন্স থাকে বা ডিডিএল ট্রিগার করে তবে কখনও কখনও আপনার জন্য এটি তৈরি করে। আপনি এগুলি কী অর্ডার এনেছেন এবং কখন ট্রিগারগুলি চালু বা বন্ধ করবেন তা আপনার কেবলমাত্র যত্নবান হতে হবে।


ওরাকল এসকিউএল বিকাশকারী v.18.3 এ ট্যাবটি বলা হয়SQL
মেটাফানিয়েল

14
create table xyz_new as select * from xyz where rownum = -1;

বারবার পুনরাবৃত্তি এড়াতে এবং 1 = 2 অবস্থার উপর ভিত্তি করে কিছুই প্রবেশ করান না


4
    DECLARE
    l_ddl   VARCHAR2 (32767);
BEGIN
    l_ddl      := REPLACE (
                      REPLACE (
                          DBMS_LOB.SUBSTR (DBMS_METADATA.get_ddl ('TABLE', 'ACTIVITY_LOG', 'OLDSCHEMA'))
                        , q'["OLDSCHEMA"]'
                        , q'["NEWSCHEMA"]'
                      )
                    , q'["OLDTABLSPACE"]'
                    , q'["NEWTABLESPACE"]'
                  );

    EXECUTE IMMEDIATE l_ddl;
END; 

3

আপনি এটি করতে পারেন Create table New_table as select * from Old_table where 1=2 ; তবে সতর্কতা অবলম্বন করুন আপনি যে টেবিলটি ডোজ তৈরি করেছেন তাতে কোনও পুরানো_ টেবিলের মতো কোনও সূচক, পিকে ইত্যাদি নেই


2
SELECT * INTO newtable
FROM oldtable
WHERE 1 = 0;

অন্যের স্কিমা ব্যবহার করে একটি নতুন, খালি টেবিল তৈরি করুন। কেবল এমন একটি শৃঙ্খলা যুক্ত করুন যা ক্যোয়ারিকে কোনও ডেটা ফেরত দেয় না:


1

আপনি একটি করতে পারেন

create table abc_new as select * from abc; 

তারপরে টেবিলটি কেটে ফেলুন abc_new। আশা করি এটি আপনার প্রয়োজনীয়তা যথেষ্ট করবে।


11
অবশ্যই, যদি আপনার মূল টেবিলটিতে প্রচুর ডেটা থাকে তবে এটি সত্যই, সত্যই খারাপ ধারণা হতে পারে। ;)
অ্যালেক্সিয়াস

1

সহজভাবে একটি কোয়েরি লিখুন:

create table new_table as select * from old_table where 1=2;

যেখানে new_tableনতুন টেবিল যা আপনি তৈরি করতে চান এবং নাম old_tableবিদ্যমান টেবিল যার গঠন আপনি কপি করতে চান তার নাম, এই শুধুমাত্র গঠন কপি হবে।


1

WHERE 1 = 0বা অনুরূপ মিথ্যা শর্তগুলি কাজ করে তবে তাদের চেহারা কেমন তা আমি পছন্দ করি না। ওরাকল 12 সি + আইএমএইচওর জন্য প্রান্তিকভাবে ক্লিনার কোডটি

CREATE TABLE bar AS SELECT * FROM foo FETCH FIRST 0 ROWS ONLY;

একই সীমাবদ্ধতা প্রযোজ্য: কেবলমাত্র কলাম সংজ্ঞা এবং তাদের নলিয়াটি নতুন টেবিলে অনুলিপি করা হয়েছে।


1

অন্য উপায়ে আপনি নীচে তালিকাভুক্ত কমান্ড থেকে টেবিল তৈরির ডিডিএল পেতে এবং তৈরিটি সম্পাদন করতে পারেন।

SELECT DBMS_METADATA.GET_DDL('TYPE','OBJECT_NAME','DATA_BASE_USER') TEXT FROM DUAL 
  • TYPEহয় TABLE, PROCEDUREইত্যাদি

এই কমান্ডের সাহায্যে আপনি ডাটাবেস অবজেক্ট থেকে সর্বাধিক ddl পেতে পারেন।


নোট করুন যে আর্গুমেন্টগুলি GET_DDLকেস সংবেদনশীল।
শ্রীধর সারনোবাত

0
Create table target_table 
As
Select * 
from source_table 
where 1=2;

উত্স_সারণযোগ্য আপনি যে টেবিলটির কাঠামোটি অনুলিপি করতে চান তা।


0

Pl / sql বিকাশকারীকে ব্যবহার করে আপনি টেবিলের নামটি স্কেল ওয়ার্কস্পেসে বা অবজেক্ট এক্সপ্লোরার-এ ডান ক্লিক করতে পারেন, "ভিউ" -তে ক্লিক করুন এবং "সিকিউএল দেখুন" ক্লিক করার চেয়ে সমস্ত সীমাবদ্ধতার সাথে টেবিলটি তৈরি করতে স্কয়ার স্ক্রিপ্ট তৈরি করে , সূচী, পার্টিশন ইত্যাদি।

এরপরে আপনি নতুন_সারণযোগ্য_নামটি ব্যবহার করে স্ক্রিপ্টটি চালাবেন


0

টেবিল তথ্য ছাড়া অনুলিপি

create table <target_table> as select * from <source_table> where 1=2;

টেবিল তথ্য দিয়ে কপি করুন

create table <target_table> as select * from <source_table>;

0
  1. xyz থেকে নির্বাচন করুন * xyz_new টেবিল তৈরি করুন;

- এটি টেবিল তৈরি করবে এবং সমস্ত ডেটা অনুলিপি করবে।

  1. xyz_new থেকে মুছুন;

- এটিতে একই টেবিল কাঠামো থাকবে তবে অনুলিপি করা সমস্ত ডেটা মুছে ফেলা হবে।

আপনি যদি উত্তর দ্বারা নির্দিষ্ট সীমাবদ্ধতাগুলি অতিক্রম করতে চান: আমি কীভাবে ডেটা অনুলিপি না করে ওরাকল টেবিলের একটি অনুলিপি তৈরি করতে পারি?


-5

উপরের কাজটি দুটি সহজ ধাপে শেষ করা যেতে পারে।

ধাপ 1:

CREATE table new_table_name AS(Select * from old_table_name);

queryউপরে একটি টেবিলের সদৃশ (বিষয়বস্তু সঙ্গে পাশাপাশি) সৃষ্টি করে।

কাঠামোটি পেতে, টেবিলের সামগ্রীগুলি ব্যবহার করে মুছুন।

ধাপ ২:

DELETE * FROM new_table_name.

আশা করি এটি আপনার সমস্যার সমাধান করে। এবং আগের পোস্টগুলি ধন্যবাদ। আমাকে অনেক অন্তর্দৃষ্টি দিয়েছে।


13
এটি truncateসংস্করণটির চেয়ে কম দক্ষ । পাশাপাশি সমস্ত ডেটার জন্য এক্সটেন্টস বরাদ্দ করার পরে, আপনি মুছে ফেলা দিয়ে এগুলি মুক্ত করছেন না, সুতরাং আপনি টেবিলটি পুরানো আকার না বাড়ানো পর্যন্ত সম্ভাব্য স্থান নষ্ট করছেন। এবং আপনি sertোকান এবং মুছুন উভয়ই পূর্বাবস্থায় ফিরিয়ে আনুন / পুনরায় তৈরি করছেন। জিমের উত্তর খুব সহজভাবে এগুলি এড়িয়ে যায়।
অ্যালেক্স পুল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.