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 構文にエラーがあります。near '; を使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。PREPARE stmt FROM 'ALTER TABLE redinfomanagerCHANGE Unterkategorie`Unte' at line 1

どうすればそれができますか?

そして、そのエラーは何を表していますか?

4

1 に答える 1

1

ENUM最初のテーブルに挿入するたびに、2 番目のテーブルの値を変更しているようですか? それを外部キー制約にしてみませんか。それには、テーブル 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 がないため、3 番目の挿入は失敗しcategoryます。

于 2013-04-18T21:15:21.200 に答える