MySql-如果不存在则创建表吗?

时间:2020-03-05 18:59:08  来源:igfitidea点击:

这是更新的问题:

当前查询正在执行以下操作:

$sql1 = "TRUNCATE TABLE fubar";
$sql2 = "CREATE TEMPORARY TABLE IF NOT EXISTS fubar SELECT id, name FROM barfu";

第一次运行包含此方法的方法时,由于该表尚不存在,它将在截断时生成一条错误消息。

我唯一的选择是执行"创建表",运行" TRUNCATE TABLE"然后填充表吗? (3个独立的查询)

最初的问题是:

我一直很努力尝试找出MySql中是否可能在不编写块sql的情况下进行以下操作:

CREATE TABLE fubar IF NOT EXISTS ELSE TRUNCATE TABLE fubar

如果我在创建表之前单独运行truncate,但该表不存在,则会收到错误消息。我试图消除该错误消息,而不必添加任何其他查询。

此代码将使用PHP执行。

解决方案

回答

怎么样:

drop table if exists fubar;
create table fubar;

还是我们只是想通过一个查询来完成?

回答

我们可以在"如果不存在创建"之后进行截断。
这样,它将永远存在...并在那时永远是空的。

CREATE TABLE fubar IF NOT EXISTS
TRUNCATE TABLE fubar

回答

好吧,还不错。更具体地说,当前查询正在执行以下操作:

$sql1 = "TRUNCATE TABLE fubar";
$sql2 = "CREATE TEMPORARY TABLE IF NOT EXISTS fubar SELECT id, name FROM barfu";

第一次运行包含此方法的方法时,由于该表尚不存在,它将在截断时生成一条错误消息。

我唯一的选择是执行"创建表",运行"截断表",然后填充表吗? (3个独立的查询)

PS感谢我们如此迅速的回应!

回答

shmuel613,最好是更新原始问题,而不是答复。最好是在一个地方包含完整的问题,而不要在讨论中分散讨论。

Ben的答案是合理的,除了他似乎不想回答的地方有一个" not"。仅在表不存在的情况下删除表是不正确的。

我们确实需要多个语句。有条件创建然后填充:

  • 如果不存在,则创建临时表fubar(id int,name varchar(80))
  • TRUNCATE TABLE fubar
  • 插入fubar SELECT * FROM barfu

或者只是拖放并重新创建

  • 如果存在则删除表fubar
  • 创建临时表fubar SELECT ID,名称为barfu

使用纯SQL,这是我们真正的两类解决方案。我喜欢第二更好。

(通过存储过程,我们可以将其简化为单个语句。类似:TruncateAndPopulate(fubar),但是到编写TruncateAndPopulate()的代码时,我们将花费更多的时间,而不仅仅是使用上述SQL。

回答

如果表存在,则执行任何查询。

用法:调用Edit_table(数据库名称,表名称,查询字符串);

  • 该过程将检查数据库名称下是否存在表名称,如果存在则执行查询字符串。以下是存储过程:
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 ;

更多关于Mysql

回答

如果使用的是PHP,请在截断表之前使用mysql_list_tables检查该表是否存在。