我尝试创建动态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行
我怎么能这样做?
这个错误代表什么?
答案 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。