আমি ব্যতীত একটি নির্দিষ্ট মাইএসকিউএল টেবিল থেকে সমস্ত কলাম পেতে একটি নির্বাচিত বিবৃতি ব্যবহার করার চেষ্টা করছি। এটি করার কোন সহজ পথ আছে কি?
সম্পাদনা করুন: এই টেবিলটিতে 53 টি কলাম রয়েছে (আমার নকশা নয়)
আমি ব্যতীত একটি নির্দিষ্ট মাইএসকিউএল টেবিল থেকে সমস্ত কলাম পেতে একটি নির্বাচিত বিবৃতি ব্যবহার করার চেষ্টা করছি। এটি করার কোন সহজ পথ আছে কি?
সম্পাদনা করুন: এই টেবিলটিতে 53 টি কলাম রয়েছে (আমার নকশা নয়)
উত্তর:
আসলে একটি উপায় আছে, এটি করার জন্য আপনার অবশ্যই অবশ্যই অনুমতি থাকা দরকার ...
SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME), '<columns_to_omit>,', '') FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '<table>' AND TABLE_SCHEMA = '<database>'), ' FROM <table>');
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
প্রতিস্থাপন করা হচ্ছে <table>, <database> and <columns_to_omit>
<column_name>
মাইএসকিএল সংজ্ঞায় (ম্যানুয়াল) তেমন কোনও জিনিস নেই। তবে আপনার যদি সত্যিই বড় সংখ্যক কলাম থাকে col1
, ...,, col100
নিম্নলিখিতগুলি কার্যকর হতে পারে:
DROP TABLE IF EXISTS temp_tb;
CREATE TEMPORARY TABLE ENGINE=MEMORY temp_tb SELECT * FROM orig_tb;
ALTER TABLE temp_tb DROP col_x;
SELECT * FROM temp_tb;
DROP TABLE IF EXISTS temp_tb;
এই ক্ষেত্রে কি কোনও ভিউ আরও ভাল কাজ করবে?
CREATE VIEW vwTable
as
SELECT
col1
, col2
, col3
, col..
, col53
FROM table
আপনি করতে পারেন:
SELECT column1, column2, column4 FROM table WHERE whatever
কলাম 3 না পেয়ে, সম্ভবত আপনি আরও সাধারণ সমাধানের সন্ধান করছেন?
আপনি যদি কোনও ক্ষেত্রের মান বাদ দিতে চান, যেমন সুরক্ষা উদ্বেগ / সংবেদনশীল তথ্যের জন্য, আপনি এই কলামটি শূন্য হিসাবে পুনরুদ্ধার করতে পারেন।
যেমন
SELECT *, NULL AS salary FROM users
salary
কলাম যুক্ত করে। তবে এটি * এর পরে পুনরুদ্ধার করা হয়েছে, এটি মূলটিকে ওভাররাইট করে। এটি সুন্দর নয়, তবে এটি কাজ করে।
আমার জ্ঞানের সেরা, সেখানে না। আপনি যেমন কিছু করতে পারেন:
SELECT col1, col2, col3, col4 FROM tbl
এবং ম্যানুয়ালি আপনি যে কলামগুলি চান তা চয়ন করুন। তবে, আপনি যদি অনেকগুলি কলাম চান, তবে আপনি কেবল একটি করতে চাইতে পারেন:
SELECT * FROM tbl
এবং আপনি যা চান না কেবল তা উপেক্ষা করুন।
আপনার বিশেষ ক্ষেত্রে, আমি পরামর্শ দেব:
SELECT * FROM tbl
যদি না আপনি কেবল কয়েকটি কলাম চান। আপনি যদি কেবল চারটি কলাম চান, তবে:
SELECT col3, col6, col45, col 52 FROM tbl
ঠিক আছে, তবে আপনি যদি 50 টি কলাম চান, তবে যে কোনও কোড যা ক্যোয়ারী তৈরি করে তা (খুব?) পড়া শক্ত হয়ে যায়।
@ মহোমেদালিড এবং @ জুনাইদ দ্বারা সমাধানগুলি চেষ্টা করার সময় আমি একটি সমস্যা পেয়েছি। তাই ভাগ করে নেওয়ার কথা ভেবেছি। যদি কলামের নামটিতে ফাঁকা জায়গা বা চেক-ইনয়ের মতো হাইফেন থাকে তবে ক্যোয়ারী ব্যর্থ হবে। কলামের নামগুলির চারপাশে ব্যাকটিক ব্যবহার করা সহজ কাজ। পরিবর্তিত ক্যোয়ারী নীচে রয়েছে
SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(CONCAT("`", COLUMN_NAME, "`")) FROM
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;
আপনি যে কলামটি নির্বাচন করতে চাননি তাতে যদি প্রচুর পরিমাণে ডেটা থাকে এবং আপনি গতির সমস্যার কারণে এটি অন্তর্ভুক্ত করতে চান না এবং আপনি অন্যান্য কলামগুলি প্রায়শই নির্বাচন করেন তবে আমি আপনাকে একটি নতুন সারণী তৈরি করার পরামর্শ দিচ্ছি যে ক্ষেত্রটি আপনি সাধারণত মূল টেবিলের চাবি দিয়ে নির্বাচন করেন না এবং সেই ক্ষেত্রটি মূল টেবিল থেকে সরিয়ে ফেলুন। যখন অতিরিক্ত ক্ষেত্রটি আসলে প্রয়োজন হয় তখন টেবিলগুলিতে যোগদান করুন।
আপনি My_table DESCRIBE ব্যবহার করতে পারেন এবং তার ফলাফলগুলিকে গতিশীলভাবে নির্বাচন নির্বাচন বিবরণ উত্পন্ন করতে ব্যবহার করতে পারেন ।
আমার মূল সমস্যাটি হ'ল টেবিলগুলিতে যোগদানের পরে আমি যে কলামগুলি পেয়েছি তা। যদিও এটি আপনার প্রশ্নের উত্তর নয় ( এক টেবিল থেকে সমস্ত কলামগুলি বাদে কীভাবে নির্বাচন করবেন ), আমি মনে করি এটি উল্লেখযোগ্য যে কেবল নির্দিষ্ট করার পরিবর্তে আপনি একটি নির্দিষ্ট টেবিল থেকে সমস্ত কলামগুলি পেতে নির্দিষ্ট করতে পারেন ।table.
এটি কীভাবে খুব কার্যকর হতে পারে তার একটি উদাহরণ এখানে দেওয়া হয়েছে:
ব্যবহারকারী নির্বাচন করুন। *, ফোন.মেটা_ভ্যালু ফোন হিসাবে, পিনকোড হিসাবে zipcode.meta_value ব্যবহারকারীদের কাছ থেকে ফোন হিসাবে ব্যবহারকারী_মেটাতে বামে যোগদান করুন চালু ((ব্যবহারকারী.উজার_আইডি = ফোন.ইউজার_আইডি) এবং (ফোন.মেটা_কি = 'ফোন')) বাম ইউজার_মেটা জিপকোড হিসাবে যোগদান করুন অন ((ইউজার.ইউজার_আইডি = জিপকোড.ইউজার_আইডি) এবং (জিপকোড.মেটা_কি = 'জিপকোড'))
ফলাফলটি হ'ল ব্যবহারকারীর টেবিলের সমস্ত কলাম এবং মেটা টেবিল থেকে যোগ হওয়া দুটি অতিরিক্ত কলাম।
আমি @Mahomedalid
এই মন্তব্যটি থেকে মন্তব্যে অবহিত করা ছাড়াও উত্তরটি পছন্দ করেছি @Bill Karwin
। উত্থাপিত সম্ভাব্য সমস্যাটি @Jan Koritak
সত্য যে আমি এটির মুখোমুখি হয়েছি তবে আমি এর জন্য একটি কৌশল খুঁজে পেয়েছি এবং যে কেউ সমস্যাটির মুখোমুখি হচ্ছে তাদের জন্য এটি এখানে ভাগ করে নিতে চাই।
আমরা রেপ্লেস ফাংশনটি প্রতিস্থাপন করতে পারি যেখানে প্রিপারেটেড স্টেটমেন্টের সাব-কোয়েরিতে এই জাতীয় ধারা রয়েছে:
আমার টেবিল এবং কলামের নাম ব্যবহার করে
SET @SQL = CONCAT('SELECT ', (SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users' AND COLUMN_NAME NOT IN ('id')), ' FROM users');
PREPARE stmt1 FROM @SQL;
EXECUTE stmt1;
সুতরাং, এটি কেবল ক্ষেত্রটি বাদ দিচ্ছে id
কিন্তু নয়company_id
আপনি সমস্ত কলামগুলি জিজ্ঞাসা করলেও আপনি যে কলামগুলি জিজ্ঞাসা করছেন তা নির্দিষ্ট করে দেওয়া ভাল অনুশীলন।
সুতরাং আমি আপনাকে বিবৃতিতে প্রতিটি কলামের নাম লেখার পরামর্শ দিচ্ছি (যা আপনি চান না তা বাদ দিয়ে)।
SELECT
col1
, col2
, col3
, col..
, col53
FROM table
শুধু কর
SELECT * FROM table WHERE whatever
তারপরে কলামটি আপনার প্রিয় প্রোগ্রামিংয়ের ভাষা: ড্রপ করুন
while (($data = mysql_fetch_array($result, MYSQL_ASSOC)) !== FALSE) {
unset($data["id"]);
foreach ($data as $k => $v) {
echo"$v,";
}
}
আমি সমস্ত কলামগুলি তালিকাভুক্ত করার "সহজ" সমাধানের সাথে একমত, তবে এটি বোঝাজনক হতে পারে এবং টাইপসগুলি প্রচুর অপচয় করার কারণ হতে পারে। আমি কোয়েরিতে আটকানোর জন্য উপযুক্ত আমার কলামগুলির নামগুলি পুনরুদ্ধার করতে একটি ফাংশন "গেটবেল কলম" ব্যবহার করি। তারপরে আমাকে যা করতে হবে তা হ'ল আমি চাই না তাদের মুছতে।
CREATE FUNCTION `getTableColumns`(tablename varchar(100))
RETURNS varchar(5000) CHARSET latin1
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE res VARCHAR(5000) DEFAULT "";
DECLARE col VARCHAR(200);
DECLARE cur1 CURSOR FOR
select COLUMN_NAME from information_schema.columns
where TABLE_NAME=@table AND TABLE_SCHEMA="yourdatabase" ORDER BY ORDINAL_POSITION;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO col;
IF NOT done THEN
set res = CONCAT(res,IF(LENGTH(res)>0,",",""),col);
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
RETURN res;
আপনার ফলাফল একটি কমা বিস্মৃত স্ট্রিং প্রদান করে, উদাহরণস্বরূপ ...
col1, col2, col3, col4 ... col53
আমি সম্মত হই যে এটি অন্য পর্যায়ে Select *
উল্লিখিত যেমন আপনার প্রয়োজন না হয় তবে এটিই যথেষ্ট নয় , আপনি এই ওভারহেড ক্রাইপটি রাখতে চান না।
আমি প্রয়োজনীয় ডেটা দিয়ে একটি ভিউ তৈরি করব , তবে আপনি Select *
স্বাচ্ছন্দ্যে পারেন - যদি ডেটাবেস সফ্টওয়্যার তাদের সমর্থন করে। অন্যথায়, বিশাল তথ্যটি অন্য টেবিলে রাখুন।
প্রথমে আমি ভেবেছিলাম আপনি নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন তবে আমি এমওয়াইএসকিউএল ডক্সটি পড়ছি বলে মনে হয় আপনি পারবেন না। আমি যদি আপনি হয়ে থাকি তবে আপনি যে কলামগুলি পেতে চান তার একটি তালিকা তৈরি করতে, অন্য একটি ভাষা (যেমন পিএইচপি) ব্যবহার করতাম, এটি একটি স্ট্রিং হিসাবে সঞ্চয় কর এবং তারপরে এসকিউএল উত্পন্ন করার জন্য এটি ব্যবহার করতাম।
আমি এটিও চেয়েছিলাম তাই আমি পরিবর্তে একটি ফাংশন তৈরি করেছি।
public function getColsExcept($table,$remove){
$res =mysql_query("SHOW COLUMNS FROM $table");
while($arr = mysql_fetch_assoc($res)){
$cols[] = $arr['Field'];
}
if(is_array($remove)){
$newCols = array_diff($cols,$remove);
return "`".implode("`,`",$newCols)."`";
}else{
$length = count($cols);
for($i=0;$i<$length;$i++){
if($cols[$i] == $remove)
unset($cols[$i]);
}
return "`".implode("`,`",$cols)."`";
}
}
সুতরাং এটি কীভাবে কাজ করে তা হল আপনি টেবিলটি প্রবেশ করুন, তারপরে একটি কলাম আপনি চান না বা অ্যারের মতো: অ্যারে ("আইডি", "নাম", "যাই হোক না কেন কলাম")
সুতরাং নির্বাচনের ক্ষেত্রে আপনি এটি এটির মতো ব্যবহার করতে পারেন:
mysql_query("SELECT ".$db->getColsExcept('table',array('id','bigtextcolumn'))." FROM table");
অথবা
mysql_query("SELECT ".$db->getColsExcept('table','bigtextcolumn')." FROM table");
আমি থমাসের উত্তর (+1;) এর সাথে একমত হওয়ার পরে, আমি যে সাবধানবাণীটি যুক্ত করতে চাইব যে কলামটি আপনি চাইবেন না তাতে আমি খুব কমই কোনও ডেটা ধারণ করব। যদি এতে প্রচুর পরিমাণে পাঠ্য, এক্সএমএল বা বাইনারি ব্লব থাকে তবে প্রতিটি কলাম পৃথকভাবে নির্বাচন করতে সময় নিন। আপনার অভিনয় অন্যথায় ক্ষতিগ্রস্থ হবে। চিয়ার্স!
মাহোমাদিদ পোস্ট করা উত্তরে একটি ছোট সমস্যা রয়েছে:
অভ্যন্তরীণ ফাংশন কোডটির পরিবর্তে " <columns_to_delete>,
" " " দ্বারা "প্রতিস্থাপন করা হয়েছিল, এই প্রতিস্থাপনটিতে সমস্যা আছে যদি প্রতিস্থাপনের ক্ষেত্রটি শেষ একের সাথে কনক্যাট স্ট্রিংয়ের শেষের সাথে চর কমা না থাকলে", "এবং এখান থেকে সরানো হয় না স্ট্রিং।
আমার প্রস্তাব:
SET @sql = CONCAT('SELECT ', (SELECT REPLACE(GROUP_CONCAT(COLUMN_NAME),
'<columns_to_delete>', '\'FIELD_REMOVED\'')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '<table>'
AND TABLE_SCHEMA = '<database>'), ' FROM <table>');
প্রতিস্থাপন <table>
, <database>
এবং `
সরানো কলামটি আমার ক্ষেত্রে "FIELD_REMOVED" স্ট্রিং দ্বারা প্রতিস্থাপিত হয়েছে এটি কাজ করে কারণ আমি মেমরি নিরাপদ করার চেষ্টা করছিলাম। (যে ক্ষেত্রটি আমি সরিয়েছিলাম তা হ'ল প্রায় 1MB এর একটি ব্লক)
@ মহোমডিডাল উত্তরের ভিত্তিতে, "মাইএসকিএল ব্যতীত সমস্ত কলাম নির্বাচন করুন" সমর্থন করার জন্য আমি কিছু উন্নতি করেছি
SET @database = 'database_name';
SET @tablename = 'table_name';
SET @cols2delete = 'col1,col2,col3';
SET @sql = CONCAT(
'SELECT ',
(
SELECT GROUP_CONCAT( IF(FIND_IN_SET(COLUMN_NAME, @cols2delete), NULL, COLUMN_NAME ) )
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tablename AND TABLE_SCHEMA = @database
),
' FROM ',
@tablename);
SELECT @sql;
আপনার কাছে প্রচুর কলস থাকলে, গ্রুপ_কনক্যাট_ম্যাক্স_লেন পরিবর্তন করতে এই এসকিএলটি ব্যবহার করুন
SET @@group_concat_max_len = 2048;
আমি হতে পারি জান কোরিটকের সুস্পষ্ট বৈষম্যের সমাধান হতে পারে
SELECT CONCAT('SELECT ',
( SELECT GROUP_CONCAT(t.col)
FROM
(
SELECT CASE
WHEN COLUMN_NAME = 'eid' THEN NULL
ELSE COLUMN_NAME
END AS col
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'
) t
WHERE t.col IS NOT NULL) ,
' FROM employee' );
সারণী:
SELECT table_name,column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'employee' AND TABLE_SCHEMA = 'test'
================================
table_name column_name
employee eid
employee name_eid
employee sal
================================
অনুসন্ধান ফলাফল:
'SELECT name_eid,sal FROM employee'
যদি এটি সর্বদা একই কলাম হয় তবে আপনি এমন একটি দর্শন তৈরি করতে পারেন যা এতে নেই।
নাহলে না, আমি তা মনে করি না।
আপনি এসকিউএল তৈরি করতে এসকিউএল ব্যবহার করতে পারেন যদি আপনি এটির যে এসকিউএল পছন্দ করেন এবং মূল্যায়ন করেন। এটি একটি সাধারণ সমাধান কারণ এটি তথ্য স্কিমা থেকে কলামের নামগুলি বের করে। এখানে ইউনিক্স কমান্ড লাইনের একটি উদাহরণ রয়েছে।
বদলে
echo $(echo 'select concat("select ", group_concat(column_name) , " from TABLE") from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1) | MYSQL
সেই কলামটি বাদ দেওয়া কলামের তালিকাটি তৈরি করার জন্য আপনাকে কেবল একবার এইভাবে কলামের নামগুলি বের করতে হবে এবং তারপরে আপনার নির্মিত ক্যোয়ারীটি কেবল ব্যবহার করতে হবে।
সুতরাং যেমন কিছু:
column_list=$(echo 'select group_concat(column_name) from information_schema.columns where table_name="TABLE" and column_name != "EXCLUDEDFIELD" group by "t"' | MYSQL | tail -n 1)
এখন আপনি নিজের তৈরি করা $column_list
প্রশ্নের মধ্যে স্ট্রিংটি পুনরায় ব্যবহার করতে পারেন ।
এই সমস্যাটি সমাধান করার জন্য আমি অন্য দৃষ্টিকোণটি যুক্ত করতে চাই বিশেষত যদি আপনার কাছে খুব কম সংখ্যক কলাম অপসারণ করতে হয়।
আপনি মাইএসকিউএল ওয়ার্কবেঞ্চের মতো একটি ডিবি সরঞ্জাম ব্যবহার করতে পারেন জন্য নির্বাচিত বিবৃতি উত্পন্ন করতে আপনি , সুতরাং আপনাকে জেনারেটেড স্টেটমেন্টের জন্য সেই কলামগুলি ম্যানুয়ালি মুছে ফেলতে হবে এবং এটি আপনার এসকিউএল স্ক্রিপ্টে অনুলিপি করতে হবে।
মাইএসকিউএল ওয়ার্কবেঞ্চে এটি তৈরি করার উপায়টি হ'ল:
টেবিলের উপর রাইট ক্লিক করুন -> এসকিএল সম্পাদককে প্রেরণ করুন -> সমস্ত বিবৃতি নির্বাচন করুন।
গৃহীত উত্তরের বেশ কয়েকটি ত্রুটি রয়েছে।
সব বিষয়গুলোকে কেবলমাত্র ব্যাকটিক অন্তর্ভুক্ত করে পরাস্ত করা যাবে SEPARATOR
আপনার জন্য GROUP_CONCAT
এবং ব্যবহার WHERE
পরিবর্তে শর্ত REPLACE()
। আমার উদ্দেশ্যে (এবং আমি আরও অনেকের কল্পনাও করি) আমি কলামের নামগুলি একই টেবিলে ফিরে আসতে চেয়েছিলাম যে তারা টেবিলে উপস্থিত হবে appear এটি অর্জনের জন্য, এখানে আমরা ফাংশনের ORDER BY
অভ্যন্তরে একটি স্পষ্ট ধারা ব্যবহার করি GROUP_CONCAT()
:
SELECT CONCAT(
'SELECT `',
GROUP_CONCAT(COLUMN_NAME ORDER BY `ORDINAL_POSITION` SEPARATOR '`,`'),
'` FROM `',
`TABLE_SCHEMA`,
'`.`',
TABLE_NAME,
'`;'
)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE `TABLE_SCHEMA` = 'my_database'
AND `TABLE_NAME` = 'my_table'
AND `COLUMN_NAME` != 'column_to_omit';
আমি এর জন্য একটি উত্তর বের করতে খুব দেরী করেছি, এটি আমি সর্বদা এটি করেছি এবং স্পষ্টভাবে বলছি, এটি সেরা উত্তরের চেয়ে ১০০ গুণ ভাল এবং আরও সুন্দর, আমি কেবল আশা করি যে কেউ এটি দেখতে পাবে। এবং এটি দরকারী মনে হয়
//create an array, we will call it here.
$here = array();
//create an SQL query in order to get all of the column names
$SQL = "SHOW COLUMNS FROM Table";
//put all of the column names in the array
foreach($conn->query($SQL) as $row) {
$here[] = $row[0];
}
//now search through the array containing the column names for the name of the column, in this case i used the common ID field as an example
$key = array_search('ID', $here);
//now delete the entry
unset($here[$key]);
SELECT
এখানে কোনও বিবৃতি নেই — শব্দটি একবারেও ঘটে না।
নির্বাচন করুন * একটি এসকিউএল অ্যান্টিপ্যাটার্ন। এটি অনেকগুলি কারণে প্রডাকশন কোডে ব্যবহার করা উচিত নয়:
প্রক্রিয়া করতে এটি একটি সামান্য বিট আরও সময় নেয়। জিনিস যখন কয়েক মিলিয়ন বার চালানো হয়, তখন সেই ক্ষুদ্র বিটগুলি বিষয় বিবেচনা করতে পারে। ধীরে ধীরে ডাটাবেস যেখানে এই ধরণের opালু কোডিংয়ের ফলে আস্তে আস্তে আক্রান্ত হয় তা হল পারফরম্যান্স টিউন করা শক্ততম ধরণের।
এর অর্থ আপনি সম্ভবত প্রয়োজনের চেয়ে বেশি ডেটা প্রেরণ করছেন যা সার্ভার এবং নেটওয়ার্ক উভয়ই বাধা সৃষ্টি করে। যদি আপনার অভ্যন্তরীণ যোগদান থাকে তবে আপনার প্রয়োজনের তুলনায় আরও ডেটা প্রেরণের সম্ভাবনা 100%।
এটি রক্ষণাবেক্ষণের সমস্যাগুলির সৃষ্টি করে বিশেষত যখন আপনি নতুন কলাম যুক্ত করেছেন যা আপনি সর্বত্র দেখতে চান না। আপনার যদি নতুন কলাম থাকে তবে সেই কলামটি দিয়ে কী করবেন তা নির্ধারণ করার জন্য আপনাকে ইন্টারফেসে কিছু করার প্রয়োজন হতে পারে।
এটি ভিউগুলি ভেঙে ফেলতে পারে (আমি জানি এসকিউএল সার্ভারে এটি সত্য, এটি মাইএসকিএলে সত্য হতে পারে বা নাও)।
কেউ যদি আলাদাভাবে ক্রমে কলামগুলি দিয়ে টেবিলগুলি পুনর্নির্মাণের জন্য যথেষ্ট নির্বোধ হন (যা আপনার করা উচিত নয় তবে এটি সমস্ত সময় ঘটে থাকে), সমস্ত প্রকারের কোড ভাঙতে পারে। একটি সন্নিবেশের জন্য এস্পিসালি কোড উদাহরণস্বরূপ যেখানে হঠাৎ আপনি নির্দিষ্ট করে না দিয়েই এই শহরটিকে ঠিকানা_3 ক্ষেত্রের মধ্যে রাখছেন, ডাটাবেস কেবল কলামগুলির ক্রমেই যেতে পারে। যখন ডেটা ধরণের পরিবর্তন হয় তখন এটি যথেষ্ট খারাপ তবে অদলবদল কলামগুলিতে একই ডেটাটাইপ থাকায় আপনি কিছু সময় খারাপ ডেটা tingোকাতে পারেন যা পরিষ্কার করতে গোলমাল। আপনার ডেটা অখণ্ডতা সম্পর্কে যত্ন নেওয়া প্রয়োজন।
যদি এটি কোনও সন্নিবেশে ব্যবহৃত হয় তবে এটি একটি টেবিলের মধ্যে একটি নতুন কলাম যুক্ত করা থাকলে অন্যটি নয় তবে এটি সারণিটি ভেঙে দেবে।
এটি ট্রিগারগুলি ভেঙে যেতে পারে। ট্রিগার সমস্যাগুলি নির্ণয় করা কঠিন হতে পারে।
কলামের নামগুলি যুক্ত করতে যে সময় লাগে তার বিপরীতে এই সমস্ত যোগ করুন (হেক আপনার এমনকি এমন একটি ইন্টারফেসও থাকতে পারে যা আপনাকে কলামের নামগুলি টেনে আনতে দেয় (আমি জানি আমি এসকিউএল সার্ভারে করি, আমি বাজি ধরছি যে এখানে কিছু উপায় আছে এটি মাইএসকিএল কোয়েরিগুলি লিখতে আপনি যে সরঞ্জামটি ব্যবহার করেন এটি করুন)) আসুন দেখুন, "আমি রক্ষণাবেক্ষণের সমস্যা তৈরি করতে পারি, আমি পারফরম্যান্সের সমস্যা সৃষ্টি করতে পারি এবং ডেটা অখণ্ডতাজনিত সমস্যা তৈরি করতে পারি, তবে ওহে আমি পাঁচ মিনিট সময় সাশ্রয় করেছি।" সত্যিই কেবল লিখুন নির্দিষ্ট কলামগুলিতে আপনি চান
আমি আপনাকে এই বইটি পড়ার পরামর্শ দিচ্ছি: http://www.amazon.com/SQL-Antipatterns-Programming-Pragmatic-Programmers-ebook/dp/B00A376BB2/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1389896688&sr=1- 1 & কীওয়ার্ড = SQL + + antipatterns