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

时间:2013-04-18 16:25:58

标签: mysql alter-table

我尝试创建动态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服务器版本对应的手册,以获得正确的语法,以便在附近使用&#39 ;;准备stmt FROM' ALTER TABLE redinfomanager更改Unterkategorie`Unte'在第1行

我怎么能这样做?

这个错误代表什么?

1 个答案:

答案 0 :(得分:1)

在第一个表上的每次插入后,您似乎在更改第二个表上的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表中没有category 3。