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
如果我在创建表之前单独运行 truncate,并且该表不存在,则会收到错误消息。我正在尝试消除该错误消息,而不必添加任何更多查询。
该代码将使用 PHP 执行。
解决方案
shmuel613,最好更新您原来的问题而不是回复。最好有一个地方包含完整的问题,而不是将其分散在讨论中。
本的回答是合理的,只是他似乎在他不想要的地方有一个“不”。仅在以下情况下才删除该表 不 存在并不完全正确。
您确实需要多个语句。有条件地创建然后填充:
- 如果不存在则创建临时表 fubar ( id int, name varchar(80) )
- 截断表 fubar
- 插入 fubar SELECT * FROM barfu
或者只是删除并重新创建
- 如果存在则删除表 fubar
- 创建临时表 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 ;
怎么样:
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 之前检查该表是否存在。