মাইএসকিউএল, এসকিউএল সহ কোনও টেবিলের মধ্যে একটি কলাম রয়েছে কিনা তা পরীক্ষা করুন


130

আমি এমন একটি ক্যোয়ারী লেখার চেষ্টা করছি যা মাইএসকিউএলে কোনও নির্দিষ্ট সারণিতে একটি নির্দিষ্ট কলাম রয়েছে কিনা তা পরীক্ষা করে দেখবে, না - এটি তৈরি করুন। নাহলে কিছুই করবেন না। এটি কোনও এন্টারপ্রাইজ-শ্রেণীর ডাটাবেসে সত্যই সহজ পদ্ধতি, তবুও মাইএসকিউএল ব্যতিক্রম বলে মনে হয় to

আমি কিছু ভেবেছি

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
           WHERE TABLE_NAME='prefix_topic' AND column_name='topic_last_update') 
BEGIN 
ALTER TABLE `prefix_topic` ADD `topic_last_update` DATETIME NOT NULL;
UPDATE `prefix_topic` SET `topic_last_update` = `topic_date_add`;
END;

কাজ করবে, তবে এটি খারাপভাবে ব্যর্থ হয়। কোন উপায় আছে?



কেন শুধু এটি তৈরি করবেন না? যদি এটি বিদ্যমান থাকে তবে তৈরিটি ব্যর্থ হবে তবে আপনি পাত্তা দিচ্ছেন না।
ব্রায়ান হুপার

সৃষ্টিটি একটি লেনদেনের ভিতরেই ঘটে এবং ব্যর্থতা পুরো লেনদেনকে শেষ করে দেবে, দুঃখজনক হলেও সত্য
ক্লপগুলি

@ হাইম - হেডআপগুলির জন্য থ্যাঙ্কস, তবে আপনার লিঙ্কে প্রস্তাবিত ক্যোয়ারী কেবলমাত্র একটি পদ্ধতির অভ্যন্তরে কাজ করবে :(
ক্লপস

2
ডিডিএল বিবৃতি বর্তমান লেনদেনে অন্তর্নিহিত প্রতিশ্রুতিবদ্ধ কারণ। dev.mysql.com/doc/refman/5.0/en/implicit-commit.html
Mchl

উত্তর:


259

এটি আমার পক্ষে ভাল কাজ করে।

SHOW COLUMNS FROM `table` LIKE 'fieldname';

পিএইচপি দিয়ে এটি কিছু হবে ...

$result = mysql_query("SHOW COLUMNS FROM `table` LIKE 'fieldname'");
$exists = (mysql_num_rows($result))?TRUE:FALSE;

8
প্রশ্নটি কীভাবে পিএইচপি + এসকিএল বা জাভা +
এসকিএল

61
আপনি প্রশ্নের উত্তর দিয়েছেন + এমন কিছু তথ্য যা আমাকে এবং সম্ভবত অন্যকে সহায়তা করেছে, +1
ফ্রান্সিসকো প্রেসেনেসিয়া

@ এমফু ধন্যবাদ এমফু, আপনি আমার দিনটি বাঁচিয়েছেন! মোহন মত কাজ করে। এই কাজের জন্য প্রক্রিয়া তৈরি বাদে অন্যতম সেরা সমাধান।
ওয়েবলবার

8
ইউরা: খাঁটি এসকিউএল / মাইএসকিউএল উত্তরটি প্রথম অংশ যেখানে তিনি বলেছিলেন "টেবিলের মতো 'ফিল্ড নেম' থেকে কলম দেখান 'use আপনি পিএইচপি কোডটিকে উপেক্ষা করতে পারেন, আপনি যদি পিএইচপি ব্যবহার করছেন বলে ফলাফলটি পুনরুদ্ধার এবং ব্যাখ্যা করার একমাত্র উপায়ের এটি উদাহরণ।
অর্ড

1
@ কোডেনামজারো আমি ধরে নিয়েছি আপনি এমএসএসকিউএল ব্যবহারের বিষয়ে উল্লেখ করছেন, এই প্রশ্নটি মাইএসকিউএল সম্পর্কিত ছিল। পড়ুন এই পোস্টে এমএস স্কুয়েল জন্য
Mfoo

158

@julio

এসকিউএল উদাহরণের জন্য ধন্যবাদ। আমি ক্যোয়ারির চেষ্টা করেছি এবং আমি মনে করি এটি সঠিকভাবে কাজ করার জন্য এটি একটি ছোট পরিবর্তন দরকার।

SELECT * 
FROM information_schema.COLUMNS 
WHERE 
    TABLE_SCHEMA = 'db_name' 
AND TABLE_NAME = 'table_name' 
AND COLUMN_NAME = 'column_name'

এটা আমার জন্য কাজ করেছে।

ধন্যবাদ!


এটি আমার সীমিত গবেষণা থেকে দেখা যাচ্ছে যে সমস্ত হোস্টিং পরিবেশের একটি তথ্য_স্কেমি ডিবি নেই। আমি যে সমস্ত সিপিএনেল পরিবেশ ব্যবহার করেছি সেগুলি এটি রয়েছে। এই সরবরাহিত সমাধানটি এই ডিবিতে বিদ্যমান on
কার্ডি 777

2
এই উত্তরটি "দেখান কলমস" ব্যবহার করার চেয়ে ভাল কারণ এটি মাইএসকিউএল সম্পর্কিত সুনির্দিষ্ট শো কলমের বিপরীতে টেবিলের তথ্য পাওয়ার জন্য এএনএসআই স্ট্যান্ডার্ড পদ্ধতি ব্যবহার করে। সুতরাং এই সমাধানটি অন্যান্য ডাটাবেসের সাথে কাজ করবে। "ইনফরমেশন_সেমিমা" ব্যবহার করা বেআইনি শোনায় এবং আপনি ভাবেন যে এটি করার জন্য এটি স্ট্যান্ডার্ড এসকিউএল উপায় নয়, তবে এটি।
orrd

5
মনে রাখবেন যে এই উত্তরটি আপনাকে কলামটির অস্তিত্ব সম্পর্কে তথ্য দেয়। আপনি শর্তসাপেক্ষে কিছু ডিডিএল বিবৃতি কার্যকর করতে চান, আপনাকে পুরো পদ্ধতিটি এমন পদ্ধতিতে গুটিয়ে রাখতে হবে যা বিবৃতি IFইত্যাদির অনুমতি দেয় ইত্যাদি ইত্যাদি সম্পর্কে কীভাবে পদ্ধতিতে মোড়ানো যায় তার উদাহরণস্বরূপ স্ট্যাকওভারফ্লো / সিকিউশনস / 8484৪7১১/২ দেখুন। কলামের জন্য পরীক্ষা এবং শর্তসাপেক্ষে ডিএমএল বিবৃতি।
ক্রিস্টোফার শুল্টজ

@Iain: stackoverflow.com/questions/32962149/... আমি তোমার উত্তরের উল্লেখ আছে
অমর সিংহ

এটি নীচে "কল শো দেখান" পদ্ধতির চেয়ে ভাল, কারণ এসকিউএল ইঞ্জেকশনের ঝুঁকি হ্রাসকারী প্যারামিটারাইজড কোয়েরিতে ব্যবহার করা যেতে পারে। কেবলমাত্র যুক্ত করতে চেয়েছিলেন আপনি TABLE_SCHEMA কলামটি জনপ্রিয় করতে DATABASE () ফাংশনটি ব্যবহার করতে পারেন।
অ্যান্ড্রু

16

@ মিচএল যা বর্ণনা করছেন তার একটি নিখুঁত উদাহরণ খুঁজছেন এমন কাউকে সাহায্য করার জন্য, এরকম কিছু চেষ্টা করুন

SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'

যদি এটি মিথ্যা (শূন্য ফলাফল) ফেরায় তবে আপনি জানেন যে কলামটির অস্তিত্ব নেই।


2
আমি বিশ্বাস করি এটি হওয়া উচিত TABLE_NAME = 'my_table', TABLE_SCHEMA স্কিমা টেবিলে হয় অর্থাৎ।SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'my_schema' AND TABLE_NAME = 'my_table' AND COLUMN_NAME = 'my_column'
AaronHolland

10

তথ্য_স্কেমি ডাটাবেস ছাড়াই প্লেইন পিএইচপি ব্যবহার করে এটি করার আরও একটি উপায় নিম্নলিখিত:

$chkcol = mysql_query("SELECT * FROM `my_table_name` LIMIT 1");
$mycol = mysql_fetch_array($chkcol);
if(!isset($mycol['my_new_column']))
  mysql_query("ALTER TABLE `my_table_name` ADD `my_new_column` BOOL NOT NULL DEFAULT '0'");

আপনি কেন তথ্য_সেমি ব্যবহার এড়াতে চান? এটি কেবল এই উদ্দেশ্যেই বিদ্যমান। (এছাড়াও, এই থ্রেড বেশ পুরনো এবং ইতিমধ্যে উত্তর দেওয়া হয়েছিল।)
লে

1
আমার পরীক্ষায়, তথ্য_সেমিমা ব্যবহারের চেয়ে এটি প্রায় 10-50x দ্রুত faster এটির জন্য টেবিলের কমপক্ষে এক সারি থাকা দরকার যা আপনি সর্বদা গ্যারান্টি দিতে পারবেন না।
মার্টিজন

isset()বিশ্বাস করা হতো 'মিথ্যা' যদি অ্যারের কী বিদ্যমান কিন্তু মান শূন্য । এটির array_key_exists()মতো ব্যবহার করা আরও ভালif( !array_key_exists( 'my_new_column', $mycol ) )
পল গিসলার 20'16

1
এই উত্তরটি আমাকে ফেসপাম বানিয়েছে কারণ আমি একটি সাধারণ isset()চেক উপেক্ষা করেছি । এটি প্রশ্নের সমাধান করে না, তবে আপনার যদি ইতিমধ্যে নির্বাচিত ক্যোয়ারী চালানো এবং মেমোরির ফলাফল পাওয়া দরকার তবে ভাল better
সিফন

10

আমি উপরের লাইনদের মন্তব্যগুলি থেকে শুরু করে এই সঞ্চিত পদ্ধতিটি একসাথে ছুঁড়ে দিয়েছি, আপনি যদি কয়েকবারের চেয়ে বেশি বার কল করার প্রয়োজন হয় তবে (এবং পিএইচপি প্রয়োজন হয় না) ধরণের চমৎকার:

delimiter //
-- ------------------------------------------------------------
-- Use the inforamtion_schema to tell if a field exists.
-- Optional param dbName, defaults to current database
-- ------------------------------------------------------------
CREATE PROCEDURE fieldExists (
OUT _exists BOOLEAN,      -- return value
IN tableName CHAR(255),   -- name of table to look for
IN columnName CHAR(255),  -- name of column to look for
IN dbName CHAR(255)       -- optional specific db
) BEGIN
-- try to lookup db if none provided
SET @_dbName := IF(dbName IS NULL, database(), dbName);

IF CHAR_LENGTH(@_dbName) = 0
THEN -- no specific or current db to check against
  SELECT FALSE INTO _exists;
ELSE -- we have a db to work with
  SELECT IF(count(*) > 0, TRUE, FALSE) INTO _exists
  FROM information_schema.COLUMNS c
  WHERE 
  c.TABLE_SCHEMA    = @_dbName
  AND c.TABLE_NAME  = tableName
  AND c.COLUMN_NAME = columnName;
END IF;
END //
delimiter ;

সাথে কাজ করা fieldExists

mysql> call fieldExists(@_exists, 'jos_vm_product', 'child_option', NULL) //
Query OK, 0 rows affected (0.01 sec)

mysql> select @_exists //
+----------+
| @_exists |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)

mysql> call fieldExists(@_exists, 'jos_vm_product', 'child_options', 'etrophies') //
Query OK, 0 rows affected (0.01 sec)

mysql> select @_exists //
+----------+
| @_exists |
+----------+
|        1 |
+----------+

মিস্টার @ কুইকশিফ্টিন, আপনাকে অনেক ধন্যবাদ এটি আমাকে কোনও ক্ষেত্র আছে কিনা তা পরীক্ষা করে কোনও টেবিলের মেয়াদ শেষযোগ্য কিনা তা পরীক্ষা করতে সহায়তা করে । ।ExpirationDate
জিনাকার্লো ফন্টোলেভো

নিবন্ধন করুন উচ্চতর স্তরের পদ্ধতি সহ স্কিমা পরিদর্শন করার জন্য আমার মাইএসকিএল-পরিদর্শকগণ প্রকল্পটিও চেকআউট করুন ।
কুইকশিফ্টিন

1
ওএমজি এটি লাইব্রেরির মতো 😱। এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ মিস্টার!
জিনকার্লো ফন্টোলেভো

8

তথ্য স্কিমা থেকে কেবল কলাম_নামটি নির্বাচন করুন এবং এই কোয়েরির ফলাফলটি ভেরিয়েবলে রাখুন। তারপরে টেবিলে পরিবর্তনের প্রয়োজন কিনা তা স্থির করতে ভেরিয়েবলটি পরীক্ষা করুন।

পিএল পাশাপাশি COLUMNS টেবিলের জন্য TABLE_SCHEMA নির্দিষ্ট করতে ভাবেন না।


1
আমি মাইএসকিউএল পরিবর্তে নতুন, আপনি এখানে একটি ছোট উদাহরণ পোস্ট করতে পারেন?
ক্লিপস

2

আমি এই সহজ স্ক্রিপ্ট ব্যবহার করছি:

mysql_query("select $column from $table") or mysql_query("alter table $table add $column varchar (20)");

আপনি ইতিমধ্যে ডাটাবেসের সাথে সংযুক্ত থাকলে এটি কাজ করে।


এটি কেবল তখনই কাজ করবে যদি টেবিলটিতে এটির সারি সারি ডেটাও থাকে। তবে যদি টেবিলটি খালি থাকে তবে এটি কাজ করবে না।
অর্ড

1
নিখুঁত নয়, পুরানো ড্রাইভার ব্যবহার করে, টেবিলটি খালি থাকলে কাজ করে না, ইনপুটগুলি এড়ায় না, তবে আপনি পছন্দ করেন কীভাবে আপনি এটি এক লাইনে করেছেন। +1
আমি একবার ভাল্লুক কুস্তি করেছিলাম।

1

এমফুর জন্য অনেক ধন্যবাদ যিনি টেবিলটিতে উপস্থিত না থাকলে ডায়নামিকভাবে কলাম যুক্ত করার জন্য সত্যিই দুর্দান্ত স্ক্রিপ্ট রেখেছেন। আমি পিএইচপি দিয়ে তার উত্তর উন্নত করেছিস্ক্রিপ্ট অতিরিক্ত আপনাকে খুঁজে কত টেবিল আসলে প্রয়োজন 'জুড়ুন কলাম' সাহায্য করে MySQL comand। শুধু রেসিপি স্বাদ। মোহন মত কাজ করে।

<?php
ini_set('max_execution_time', 0);

$host = 'localhost';
$username = 'root';
$password = '';
$database = 'books';

$con = mysqli_connect($host, $username, $password);
if(!$con) { echo "Cannot connect to the database ";die();}
mysqli_select_db($con, $database);
$result=mysqli_query($con, 'show tables');
$tableArray = array();
while($tables = mysqli_fetch_row($result)) 
{
     $tableArray[] = $tables[0];    
}

$already = 0;
$new = 0;
for($rs = 0; $rs < count($tableArray); $rs++)
{
    $exists = FALSE;

    $result = mysqli_query($con, "SHOW COLUMNS FROM ".$tableArray[$rs]." LIKE 'tags'");
    $exists = (mysqli_num_rows($result))?TRUE:FALSE;

    if($exists == FALSE)
    {
        mysqli_query($con, "ALTER TABLE ".$tableArray[$rs]." ADD COLUMN tags VARCHAR(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL");
        ++$new;
        echo '#'.$new.' Table DONE!<br/>';
    }
    else
    {
        ++$already;
        echo '#'.$already.' Field defined alrady!<br/>';    
    }
    echo '<br/>';
}
?>

1

নমুনা পিডিও সহ আমার এই কাজ:

public function GetTableColumn() {      
$query  = $this->db->prepare("SHOW COLUMNS FROM `what_table` LIKE 'what_column'");  
try{            
    $query->execute();                                          
    if($query->fetchColumn()) { return 1; }else{ return 0; }
    }catch(PDOException $e){die($e->getMessage());}     
}

0

পরিবর্তনের টেবিল / মোডেফাই সিওএল বা অন্য কোনও টেবিল মোড অপারেশনগুলিকে কোনও ট্রান্সএকশনের মধ্যে রাখবেন না। লেনদেনের জন্য একটি ব্যর্থতা আবার গুটিয়ে নিতে সক্ষম হয় অলটারেশনগুলির জন্য নয় ... এটি লেনদেনে প্রতিবারই ত্রুটি হয়ে যাবে।

কেবল টেবিলে একটি নির্বাচন করুন * ক্যোয়ারী চালান এবং কলামটি সেখানে আছে কিনা তা পরীক্ষা করুন ...


ALTER(এবং এর মতো ডিডিএল) প্রকৃতপক্ষে লেনদেনের প্রতিশ্রুতিবদ্ধ (স্পষ্টতই)। কিন্তু নির্বাচন * ব্যবহার করা কেবলমাত্র কলামটির অস্তিত্ব পরীক্ষা করার জন্য নেটওয়ার্কে একটি বড় ওভারহেড উত্পন্ন করবে। পরিবর্তে আপনি চেষ্টা করতে SELECT my_col_to_check FROM t LIMIT 0পারেন: যদি মাইএসকিএল একটি ত্রুটি উত্পন্ন করে, তবে কলাম সম্ভবত উপস্থিত নেই (তবুও ত্রুটিটি পরীক্ষা করুন, এটি কোনও নেটওয়ার্ক ইস্যু বা যাই হোক না কেন!); যদি এটি কোনও ত্রুটি সৃষ্টি করে না, তবে কলামটি বিদ্যমান। আমি নিশ্চিত নই যে কলামের অস্তিত্বের জন্য এটি যাচাই করার সেরা উপায়।
জেনোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.