MySql - 如果不存在则创建表,否则清空表?

23

以下是更新后的问题:

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

$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执行。

6个回答

28

shmuel613,更新原问题比回复更好。最好将完整问题放在一个地方,而不是在讨论中分散开来。

Ben的答案很合理,只是他似乎把“不”放在了不想要的位置。如果表不存在才删除表不太正确。

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

  1. CREATE TEMPORARY TABLE IF NOT EXISTS fubar ( id int, name varchar(80) )
  2. TRUNCATE TABLE fubar
  3. INSERT INTO fubar SELECT * FROM barfu

或者只需删除和重新创建

  1. DROP TABLE IF EXISTS fubar
  2. CREATE TEMPORARY TABLE fubar SELECT id, name FROM barfu

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

(使用存储过程,您可以将其简化为单个语句。类似于:TruncateAndPopulate(fubar)但是,编写TruncateAndPopulate()的代码需要比使用上述SQL花费更多的时间。)


3

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

用法:call 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 ;

More on Mysql


3

您可以在“如果不存在则创建”后进行截断。这样它将始终存在,并且始终在该点为空。

CREATE TABLE fubar IF NOT EXISTS
TRUNCATE TABLE fubar

2

你觉得如何:

DROP TABLE IF EXISTS fubar;
CREATE TABLE fubar;

您是想用单个查询完成吗?

如果 t 不存在,就放弃它吧? - 11684
删除和创建带有索引的表会很慢,对吗? - Joeri

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

0

好的,還不錯。更具體地說,當前查詢正在執行以下操作:

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

第一次運行包含此內容的方法時,由於表尚不存在,它會生成關於截斷的錯誤消息。

我的唯一選擇是執行“CREATE TABLE”,運行“TRUNCATE TABLE”,然後填充表格嗎?(3個單獨的查詢)

附註:感謝您的快速回應!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接