【问题标题】:Alter table based on query result without using procedure in mysql根据查询结果更改表而不使用mysql中的过程
【发布时间】:2013-11-26 17:22:59
【问题描述】:

我从以下查询中得到“真”或“假”的结果。

SELECT CASE WHEN a.counter>=1 THEN 'True'

                               ELSE 'False' END AS isUserAuthorised
                               FROM (SELECT Count(*) as counter FROM information_schema.statistics
                                    WHERE  table_name = 'tblechecklistcustomer' AND index_name = 'index_Cust') a;

I want to execute the below query if the above query result  is "True"

ALTER TABLE tblechecklistcustomer DROP INDEX index_Cust;

我如何在单个查询中执行此操作/使用 if 编码而不使用存储过程 我试过这种方式

 SELECT CASE WHEN a.counter>=1 THEN 'True'
                               ELSE 'False' END AS isUserAuthorised
                               FROM (SELECT Count(*) as counter FROM information_schema.statistics
                                    WHERE  table_name = 'tblechecklistcustomer' AND index_name = 'index_Cust') a)=='True')
                                   then ALTER TABLE tblechecklistcustomer DROP INDEX index_Cust; 

【问题讨论】:

  • 我认为这是不可能的。 DDL 语句不能放在 SELECT 查询中。
  • 在一个过程中,我认为您可以使用检查a.counterIF 语句和SELECT COUNT(*) 子查询的结果,在THEN 中使用ALTER 语句条款。但是,我在编写mysql程序方面不是很有经验。
  • 爱比特,为什么?

标签: mysql stored-procedures if-statement


【解决方案1】:

结构如下:

/* CODE FOR DEMONSTRATION PURPOSES */
DROP TABLE IF EXISTS `tblechecklistcustomer`;

CREATE TABLE `tblechecklistcustomer` (
  `cust` INT(11) DEFAULT NULL,
  KEY `index_cust` (`cust`)
) ENGINE=INNODB;

使用存储过程可以是这样的:

/* CODE FOR DEMONSTRATION PURPOSES */
DELIMITER $$

CREATE PROCEDURE `sp_test`()
BEGIN
    IF EXISTS (SELECT NULL
                FROM
                    `information_schema`.`statistics`
                WHERE
                    `table_schema` = DATABASE() AND
                    `table_name` = 'tblechecklistcustomer' AND
                    `index_name` = 'index_cust') THEN
        ALTER TABLE `tblechecklistcustomer` DROP INDEX `index_cust`;
    END IF;
END$$

DELIMITER ;

如果没有存储过程,您可以尝试以下操作:

/* CODE FOR DEMONSTRATION PURPOSES */
SELECT
    CASE
        WHEN `a`.`counter` >= 1 THEN TRUE
        ELSE FALSE
    END INTO @`counter`
FROM (SELECT @`counter` := NULL) `der`,
    (SELECT COUNT(0) AS `counter`
        FROM
            `information_schema`.`statistics`
        WHERE
            `table_schema` = DATABASE() AND
            `table_name` = 'tblechecklistcustomer' AND
            `index_name` = 'index_cust') `a`;
SET @`alter` := 'ALTER TABLE `tblechecklistcustomer` DROP INDEX `index_cust`'; 
SET @`nothing` := 'DO (SELECT NULL)';
SET @`stmt` := IF(@`counter`, @`alter`, @`nothing`);
PREPARE `exec` FROM @`stmt`;
EXECUTE `exec`;
DEALLOCATE PREPARE `exec`;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2017-11-21
    相关资源
    最近更新 更多