【问题标题】:MySql - Create Table If Not Exists Else Truncate?MySql - 如果不存在则创建表否则截断?
【发布时间】:2023-03-23 11:53:01
【问题描述】:

这是更新后的问题:

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

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

【问题讨论】:

    标签: mysql truncate exists


    【解决方案1】:

    怎么样:

    DROP TABLE IF EXISTS fubar;
    CREATE TABLE fubar;
    

    或者你的意思是你只想用一个查询来做?

    【讨论】:

    • 如果 t 不存在 则删除它?
    • 使用索引删除和创建会很慢吧?
    【解决方案2】:

    您可以在“如果不存在则创建”之后进行截断。 这样它就永远存在了……并且在那一点上永远是空的。

    CREATE TABLE fubar IF NOT EXISTS
    TRUNCATE TABLE fubar
    

    【讨论】:

      【解决方案3】:

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

      $sql1 = "截断表 fubar"; $sql2 = "如果不存在 fubar 则创建临时表 SELECT id, name FROM barfu";

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

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

      PS - 感谢您如此迅速地回复!

      【讨论】:

        【解决方案4】:

        shmuel613,最好更新您的原始问题而不是回复。最好有一个地方包含完整的问题,而不是在讨论中展开。

        Ben 的回答是合理的,只是他似乎有一个“不”,他不想要一个。仅当表存在时才删除该表是不太正确的。

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

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

        或者只是删除并重新创建

        1. 如果存在 fubar 则删除表
        2. CREATE TEMPORARY TABLE fubar SELECT id, name FROM barfu

        对于纯 SQL,这些是您真正的两类解决方案。我更喜欢第二个。

        (使用存储过程,您可以将其简化为一条语句。类似:TruncateAndPopulate(fubar) 但是当您为 TruncateAndPopulate() 编写代码时,您将花费更多时间,而不仅仅是使用上面的 SQL。)

        【讨论】:

          【解决方案5】:

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

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

          More on Mysql

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-09-19
              • 2018-12-18
              • 1970-01-01
              • 1970-01-01
              • 2021-04-01
              • 2017-03-30
              • 2021-01-31
              • 2013-05-26
              相关资源
              最近更新 更多