代码之家  ›  专栏  ›  技术社区  ›  BrainStone

在CREATE TRIGGER中的ALTER TABLE中使用查询

  •  0
  • BrainStone  · 技术社区  · 11 年前

    我正在尝试创建一个动态ALTER TABLE命令,但其中一些命令将从查询中生成。问题是我想在触发器中使用这个!

    尝试1:

    ALTER TABLE `redinfomanager` CHANGE `Unterkategorie` `Unterkategorie` ENUM(("SELECT GROUP_CONCAT(CONCAT('\'', REPLACE(`Unterkategorien`, '\r\n', '\',\''), '\'') SEPARATOR  ',') FROM `kategorien` GROUP BY '1'")) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL;
    

    尝试2:

    SELECT @tmp:=GROUP_CONCAT(CONCAT('\'', REPLACE(`Unterkategorien`, '\r\n', '\',\''), '\'') SEPARATOR  ',') FROM `kategorien` GROUP BY '1';
    SET @query=CONCAT('ALTER TABLE `redinfomanager` CHANGE `Unterkategorie` `Unterkategorie` ENUM(', @tmp, ') CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL');
    PREPARE stmt FROM @query;
    EXECUTE stmt;
    

    尝试3:

    SET @kat = (SELECT GROUP_CONCAT(CONCAT('\'', REPLACE(`Unterkategorien`, '\r\n', '\',\''), '\'') SEPARATOR  ',') FROM kategorien GROUP BY '1');
    PREPARE stmt FROM 'ALTER TABLE redinfomanager CHANGE Unterkategorie Unterkategorie ENUM(?) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL';
    EXECUTE stmt USING @kat;
    

    它告诉我:

    1064-您的SQL语法出现错误;查看与您的MySQL服务器版本相对应的手册,以获得在附近使用的正确语法;从ALTER TABLE准备语句 redinfomanager 更改 Unterkategorie `在第1行取消连接

    我怎么能这么做?

    这个错误代表什么?

    1 回复  |  直到 8 年前
        1
  •  1
  •   bhamby    11 年前

    看起来你正在改变 ENUM 在第一个表上每次插入后,第二个表上的值?为什么不把它变成 foreign key constraint 这将需要您想放入表2中的任何值都必须具有表1中的值。它的效率也会高得多:

    只是一个例子( sqlfiddle link ):

    CREATE TABLE category (
      id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
      description VARCHAR(50)
    );
    
    CREATE TABLE thing (
      id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
      cat_id INTEGER,
      description VARCHAR(50),
      FOREIGN KEY (cat_id) REFERENCES category(id)
    );
    
    INSERT INTO category (description) 
    VALUES 
       ('Category 1')
      ,('Category 2');
    
    INSERT INTO thing (cat_id, description)
    VALUES 
       (1, 'Thing 1')
      ,(1, 'Thing 2')
      ,(2, 'Thing 3');
    
    INSERT INTO thing (cat_id, description)
    VALUES
       (3, 'Imma Fail!')
    

    如果您运行它,第三次插入将失败,因为没有 id 共3个 category 桌子