কীভাবে INSERT- এ স্বয়ংক্রিয় সংযোজন কীগুলি পরিচালনা করা হয় (নির্বাচন করুন * থেকে…)


13

আমার আছে table1এবং table2মাইএসকিউএল আছে। উভয়ের একটি প্রাথমিক auto_incrementকী আছে id

যদি টেবিল স্কিমার সাথে মেলে এবং আমি INSERT INTO table1 (SELECT * FROM table2)নতুন সারিগুলিতে table1? োকানো সেক্ষেত্রে কী ঘটে ? idযখন কোনও সারি table1একই থাকে তখন তারা কি তাদের পুরানো মূল্যবোধ রাখে এবং বিরোধ সৃষ্টি করে id? নতুন মানগুলি কি অটো_সংশোধনের দ্বারা উত্পন্ন? এটি স্টোরেজ ইঞ্জিন বা লকিংয়ের উপর নির্ভর করে?

উত্তর:


13

আপনি একটি স্বয়ং-বৃদ্ধি কলামে sertোকাতে এবং একটি মান নির্দিষ্ট করতে পারেন। এটা ঠিকাসে; এটি কেবল অটো-ইনক্রিমেন্ট জেনারেটরকে ওভাররাইড করে।

আপনি যদি NULL বা 0 বা একটি মান সন্নিবেশ করানোর চেষ্টা করেন বা DEFAULTআপনি যদি নিজের INSERT বিবৃতিতে কলামগুলি থেকে স্ব-বর্ধিত কলামটি বাদ দেন, এটি স্বয়ংক্রিয়-বৃদ্ধিকরণ জেনারেটরকে সক্রিয় করে।

সুতরাং, এটি ঠিক আছে INSERT INTO table1 SELECT * FROM table2(যাইহোক, আপনার প্রথম বন্ধনী প্রয়োজন নেই)। এর অর্থ হ'ল আইডি মানগুলি table2ভারব্যাটিম অনুলিপি করা table1হবে এবং নতুন মান উত্পন্ন করবে না

আপনি যদি নতুন মান উত্পন্ন করতে চান তবে আপনি এটিtable1 করতে পারবেন না SELECT *। হয় আপনি আইডি কলামের জন্য নাল বা 0 ব্যবহার করেন:

INSERT INTO table1 SELECT 0, col1, col2, col3, ... FROM table2;

অন্যথায় আপনি INSERT স্টেটমেন্টের কলাম তালিকা এবং নির্বাচন নির্বাচন বিবরণের নির্বাচনের তালিকা উভয় থেকে কলামটি বাদ দিতে পারেন:

-- No id in either case:
INSERT INTO table1 (col1, col2, col3) SELECT col1, col2, col3, ... FROM table2;

আপনি জিজ্ঞাসার আগে, এসকিউএলে "একটি কলাম বাদে নির্বাচন করুন" এর জন্য কোনও সিনট্যাক্স নেই। আপনি যে কলামের নাম columnোকাতে চান তার পুরো তালিকাটি বানান করতে হবে।


এমন কোনও বিকল্প নেই যা মান হিসাবে 0 টি সন্নিবেশ করানোর অনুমতি / নিষেধ করে? (আপনার ২ য় অনুচ্ছেদের বিষয়ে)
সাসাচ রামবিউড

1
হ্যাঁ, এসকিউএল_মোডে = NO_AUTO_VALUE_ON_ZERO , অন্যথায় আমরা কখনই এআই কলামে আক্ষরিক শূন্য মান sertোকাতে পারি না। আপনি যদি এই এসকিউএল মোডটি ব্যবহার করেন তবে ন্যূনুয়ালি এখনও এআই জেনারেটরটি সক্রিয় করতে কাজ করে বা কলামটি বাদ দিয়ে কাজ করে।
বিল কারভিন

@ বিলকারভিন, আপনার শেষ অনুচ্ছেদে সাবরেসল্ট পাওয়ার পরে select * from table, এই প্রথম স্তরটি অপসারণের জন্য কোনও উপায় নেই?
পেসারিয়ার

@ পেসারিয়র, যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনি জিজ্ঞাসা করছেন যে এটির select *অর্থ কি না select * except for the first column। উত্তর না হয়। select *সর্বদা সেই টেবিল থেকে সমস্ত কলাম অনুরোধ করে। আপনি যদি একটি উপসেট চান, আপনার অবশ্যই কলামগুলি চান তা বানান করতে হবে।
বিল কারভিন 24'15

@ বিলকারভিন, হুম, আমি টেবিলটি উল্লম্বভাবে যেখানে ক্লজগুলি করার জন্য টেবিলটি আঁকানোর কথা ভাবছিলাম , তারপরে এটি পিভোটিং উদাহরণস্বরূপ select*from transpose(select*from(transpose(select*from table where Id=1))where col_name<>Id)বা সম্ভবত আরও সংক্ষিপ্তভাবে select*from table where Id=1 and $col<>Id, আপনি কী মনে করেন?
পেসারিয়ার

3

নির্বাচন করা আইডিটি একই মান হবে সারণীতে .োকানো। আপনি বিদ্যমান সারিগুলিকে সদৃশ করার চেষ্টা করলে এটির একটি ত্রুটি ঘটবে।

বিল কারউইন: আপনি জিজ্ঞাসার আগে, এসকিউএলে "একটি কলাম বাদে নির্বাচন করুন" এর জন্য কোনও সিনট্যাক্স নেই।

কিছু সৃজনশীলতার সাথে এটি অর্জন করা যেতে পারে:

SET @sql = CONCAT('INSERT INTO <table> SELECT null, 
    ', (SELECT GROUP_CONCAT(COLUMN_NAME) 
    FROM information_schema.columns 
    WHERE table_schema = '<database>' 
    AND table_name = '<table>' 
    AND column_name NOT IN ('id')), ' 
from <table> WHERE id = <id>');  

PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

এর ফলে নির্বাচিত সারির আইডির পরিবর্তে নতুন সারিটি একটি স্বয়ংক্রিয় বর্ধিত আইডি পাবে।


2
চতুর, তবে আমার কাছে, এটি আপনি columnোকাতে চান কলামের পুরো তালিকাটির বানান হিসাবে গণ্য।
বিল কারভিন 23

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