这是更新后的问题:

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

$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

如果我在创建表之前单独运行 truncate,并且该表不存在,则会收到错误消息。我正在尝试消除该错误消息,而不必添加任何更多查询。

该代码将使用 PHP 执行。

有帮助吗?

解决方案

shmuel613,最好更新您原来的问题而不是回复。最好有一个地方包含完整的问题,而不是将其分散在讨论中。

本的回答是合理的,只是他似乎在他不想要的地方有一个“不”。仅在以下情况下才删除该表 存在并不完全正确。

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

  1. 如果不存在则创建临时表 fubar ( id int, name varchar(80) )
  2. 截断表 fubar
  3. 插入 fubar SELECT * FROM barfu

或者只是删除并重新创建

  1. 如果存在则删除表 fubar
  2. 创建临时表 fubar 从 barfu 中选择 id、名称

对于纯 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 ;

更多关于 MySQL 的内容

怎么样:

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";

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

我唯一的选择是执行“CREATE TABLE”,运行“TRUNCATE TABLE”,然后填充表吗?(3个单独的查询)

PS-感谢您这么快回复!

如果您使用 PHP,请使用 mysql_list_tables 在 TRUNCATE 之前检查该表是否存在。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top