MySql - إنشاء جدول في حالة عدم وجوده وإلا هل سيتم اقتطاعه؟
سؤال
هنا هو السؤال المحدث:
الاستعلام الحالي يفعل شيئًا مثل:
$sql1 = "TRUNCATE TABLE fubar";
$sql2 = "CREATE TEMPORARY TABLE IF NOT EXISTS fubar SELECT id, name FROM barfu";
في المرة الأولى التي يتم فيها تشغيل الطريقة التي تحتوي على هذا، فإنها تولد رسالة خطأ على الاقتطاع لأن الجدول غير موجود بعد.
هو خياري الوحيد للقيام بذلك CREATE TABLE
, ، قم بتشغيل TRUNCATE TABLE
, ، ثم املأ الجدول؟(3 استفسارات منفصلة)
السؤال الأصلي كان:
لقد واجهت صعوبة في محاولة معرفة ما إذا كان ما يلي ممكنًا في MySql دون الحاجة إلى كتابة كتلة SQL:
CREATE TABLE fubar IF NOT EXISTS ELSE TRUNCATE TABLE fubar
إذا قمت بتشغيل عملية الاقتطاع بشكل منفصل قبل إنشاء الجدول، وكان الجدول غير موجود، فسأتلقى رسالة خطأ.أحاول إزالة رسالة الخطأ هذه دون الحاجة إلى إضافة أي استفسارات أخرى.
سيتم تنفيذ هذا الكود باستخدام PHP.
المحلول
shmuel613، سيكون من الأفضل تحديث سؤالك الأصلي بدلاً من الرد.من الأفضل أن يكون هناك مكان واحد يحتوي على السؤال الكامل بدلاً من نشره في المناقشة.
إجابة بن معقولة، إلا أنه يبدو أن لديه "لا" حيث أنه لا يريد ذلك.إسقاط الجدول إلا إذا كان لا الوجود ليس صحيحا تماما.
سوف تحتاج بالفعل إلى بيانات متعددة.إما الإنشاء المشروط ثم النشر:
- إنشاء جدول مؤقت إذا لم يكن موجودًا fubar ( id int, name varchar(80))
- اقتطاع فوبار الجدول
- أدخل في fubar حدد * من barfu
أو مجرد إسقاط وإعادة الإنشاء
- قم بإسقاط الجدول إذا كان موجودًا
- إنشاء جدول مؤقت، معرف تحديد fubar، الاسم من barfu
مع لغة SQL الخالصة، فإن هاتين الفئتين الحقيقيتين من الحلول.أنا أحب الثاني أفضل.
(باستخدام الإجراء المخزن، يمكنك تقليله إلى عبارة واحدة.شيء مثل:TruncateAndPopulate(fubar) ولكن بحلول الوقت الذي تكتب فيه التعليمات البرمجية لـ TruncateAndPopulate()، ستقضي وقتًا أطول من مجرد استخدام SQL أعلاه.)
نصائح أخرى
يمكنك إجراء الاقتطاع بعد "الإنشاء إذا لم يكن موجودًا".هكذا سيكون موجودا دائما..وتكون دائمًا فارغة في تلك المرحلة.
CREATE TABLE fubar IF NOT EXISTS
TRUNCATE TABLE fubar
تنفيذ أي استعلام في حالة وجود الجدول.
الاستخدام: call Edit_table(database-name,table-name,query-string);
- سيتحقق الإجراء من وجود اسم الجدول ضمن اسم قاعدة البيانات وسينفذ سلسلة الاستعلام إذا كانت موجودة.فيما يلي الإجراء المخزن:
DELIMITER $$ DROP PROCEDURE IF EXISTS `Edit_table` $$ CREATE PROCEDURE `Edit_table` (in_db_nm varchar(20), in_tbl_nm varchar(20), in_your_query varchar(200)) DETERMINISTIC BEGIN DECLARE var_table_count INT; select count(*) INTO @var_table_count from information_schema.TABLES where TABLE_NAME=in_tbl_nm and TABLE_SCHEMA=in_db_nm; IF (@var_table_count > 0) THEN SET @in_your_query = in_your_query; #SELECT @in_your_query; PREPARE my_query FROM @in_your_query; EXECUTE my_query; ELSE select "Table Not Found"; END IF; END $$ DELIMITER ;
ماذا عن:
DROP TABLE IF EXISTS fubar;
CREATE TABLE fubar;
أم أنك تقصد أنك تريد فقط القيام بذلك من خلال استعلام واحد؟
حسنا، ليس سيئا.لكي نكون أكثر تحديدًا، فإن الاستعلام الحالي يفعل شيئًا مثل:
$sql1 = "TRUNCATE TABLE fubar"; $sql2 = "CREATE TEMPORARY TABLE IF NOT EXISTS fubar SELECT id, name FROM barfu";
في المرة الأولى التي يتم فيها تشغيل الطريقة التي تحتوي على هذا، فإنها تولد رسالة خطأ على الاقتطاع لأن الجدول غير موجود بعد.
هل خياري الوحيد هو القيام بـ "إنشاء جدول"، وتشغيل "TRUNCATE TABLE"، ثم ملء الجدول؟(3 استفسارات منفصلة)
ملاحظة: شكرًا على الرد بهذه السرعة!
إذا كنت تستخدم PHP، استخدم mysql_list_tables للتحقق من وجود الجدول قبل اقتطاعه.