MySql - إنشاء جدول في حالة عدم وجوده وإلا هل سيتم اقتطاعه؟

StackOverflow https://stackoverflow.com/questions/84330

  •  01-07-2019
  •  | 
  •  

سؤال

هنا هو السؤال المحدث:

الاستعلام الحالي يفعل شيئًا مثل:

$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، سيكون من الأفضل تحديث سؤالك الأصلي بدلاً من الرد.من الأفضل أن يكون هناك مكان واحد يحتوي على السؤال الكامل بدلاً من نشره في المناقشة.

إجابة بن معقولة، إلا أنه يبدو أن لديه "لا" حيث أنه لا يريد ذلك.إسقاط الجدول إلا إذا كان لا الوجود ليس صحيحا تماما.

سوف تحتاج بالفعل إلى بيانات متعددة.إما الإنشاء المشروط ثم النشر:

  1. إنشاء جدول مؤقت إذا لم يكن موجودًا fubar ( id int, name varchar(80))
  2. اقتطاع فوبار الجدول
  3. أدخل في fubar حدد * من barfu

أو مجرد إسقاط وإعادة الإنشاء

  1. قم بإسقاط الجدول إذا كان موجودًا
  2. إنشاء جدول مؤقت، معرف تحديد 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 للتحقق من وجود الجدول قبل اقتطاعه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top