0

我正在尝试创建一个动态 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 服务器版本相对应的手册,以获取在 '; 附近使用的正确语法。在第 1 行从 'ALTER TABLE redinfomanagerCHANGE Unterkategorie'Unte' 准备stmt

我怎么能那样做?

这个错误代表什么?

4

1 回答 1

1

似乎您在ENUM第一个表上每次插入后都在更改第二个表上的值?为什么不直接将其设为外键约束。这将要求您要放入表 2 中的任何值都必须具有表 1 中的值。它也会更有效率:

只是一个例子(sqlfiddle 链接):

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

于 2013-04-18T21:15:21.200 回答