2016-04-23 4 views
0

エラーコード:フィールドリストの1109不明なテーブルの番号 "トリガがテーブルを認識しません(トリガーは、別のテーブルに挿入するために複数の行にNEW.valuesの内容を分割する)

なぜ私のコードはテーブル番号がないと思って、それを修正する方法はですか?

そして、可能であれば、回答の質問をなぜトリガーで使用するのですか?私は2

たぶん十分な方法があるにそれらを分割することができ、いくつかの列フィールドで二つの言葉を持っているテーブルからのようsunstring_indexと組み合わせ使用されている

P.S番号テーブル?

drop schema exp; 
create database exp; 
use exp; 
create table IDVU (
`ID` int(8) unsigned not null auto_increment , 
`VU` varchar(45) not null, 
PRIMARY KEY (`id`), 
KEY `ix_VU` (`VU`) 
)ENGINE = InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

create table sep (
ID1 int(8) unsigned NOT NULL primary key auto_increment, 
ID2 int(8) unsigned not null, 
V varchar(45) not null, 
U varchar(45) not null, 
KEY `ix_ID2` (`ID2`), 
CONSTRAINT `ID_IDVU_SEP` FOREIGN KEY (`ID2`) REFERENCES `IDVU` (`ID`) 
ON DELETE CASCADE ON UPDATE CASCADE 
)ENGINE = InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

create table numbers select 1 n union all select 2; 
delimiter $$ 
CREATE TRIGGER `edit` AFTER INSERT 
ON `idvu` 
FOR EACH ROW BEGIN 

    IF new.VU like '% %' THEN 
     SET @V = SUBSTRING_INDEX(SUBSTRING_INDEX(new.Vu, ' ', numbers.n), ' ', -1), 
      @U = SUBSTRING_INDEX(SUBSTRING_INDEX(new.Vu, ' ', numbers.n), ' ', -1); 
    else 
     SET @V = 'NEW',@U = 'NEW'; 
    END IF; 

    INSERT INTO sep (ID2,V, U) VALUES (new.ID,@V, @U); 

END$$ 

delimiter ; 

select * from idvu order by ID; 
select * from sep order by ID1; 
insert into iDVU value (2,'Dd Rr'); 

UPDATE: OPは異なる行にtable1に挿入NEW.valuesの内容を壊すとtable2に挿入するトリガーAFTER INSERTを作成したいと考えています。

Table1 
Number Player Team    Position 
    1  Jan Ho Team 1   C 
    2  Mike Dog Team 3   LW 
4 8  Slim Dre Team 4, Team 1 G D 
    6  Mad Dog Team 2   D 

行にブレークそれをし、あなただけの文字列を破るしようとしているならば、あなたはこのようにそこでは1と2をハードコーディングすることができますtable2

以下のような
Table2 
Number Player Team    Position 
    1  Jan Ho Team 1   C 
    2  Mike Dog Team 3   LW 
    4  Slim Dre Team 4   G 
    8  Slim Dre Team 1   D 
    6  Mad Dog Team 2   D 
+1

?それから選択する必要があります。 –

+0

テーブルIDVUがテーブル1の情報で更新される場合は、[1](http://imgur.com/DUDjhET)になります。トリガーが動作し、link1のようにtable1(IDVU)の値をtable2(sep)に挿入します。 –

+0

あなたがしようとしていることについて私の答えを見てください。'numbers'テーブルは必要ありません。なぜなら、現在はテーブルの値をハードコーディングしているからです。 –

答えて

0

に挿入し、とにかく1と2を含むようにテーブルが現在ハードコーディングされているので、数字のテーブルで1と2をつかむ必要はありません。見た後、あまりにも

SET @V = SUBSTRING_INDEX(new.Vu, ' ', 1), 
     @U = SUBSTRING_INDEX(new.Vu,' ', -1); 

sqlfiddle

UPDATE作品twice..this

SET @V = SUBSTRING_INDEX(SUBSTRING_INDEX(new.Vu, ' ', 1), ' ', -1), 
    @U = SUBSTRING_INDEX(SUBSTRING_INDEX(new.Vu, ' ', 2), ' ', -1); 

sqlfiddle

が、その後、私はあなたもSUBSTRING_INDEXを(呼び出す必要はありません気付い)あなたのコメントは、なぜあなたがテーブルnumbersを作成したいのか分かりますので、あなたのトリガーは このようなもの。 最初に、テーブル番号numbersを作成します。このテーブルには、1〜10のn値を持つ行が含まれます(行に分割するフィールドの最大数)。 numbersから選択します.nの値は、< =番号のフィールド数です。次に、SUBSTRING_INDEX()関数を適用して、フィールドをn位置に取得します。あなたは数字のテーブルでやろうとしているもの

create table numbers 
select 1 as n 
union select 2 
union select 3 
union select 4 
union select 5 
union select 6 
union select 7 
union select 8 
union select 9 
union select 10; 

CREATE TRIGGER `edit2` AFTER INSERT 
ON `table1` 
FOR EACH ROW BEGIN 

    INSERT INTO table2 (number,player,team,position) 
    SELECT 
    SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.number,' ',n),' ',-1) as number, 
    NEW.player as player, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.team,', ',n),', ',-1) as team, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.position,' ',n),' ',-1) as position 
    FROM 
    numbers n 
    WHERE LENGTH(NEW.number) 
      - LENGTH(REPLACE(NEW.number,' ','')) 
      + 1 >= n.n; 

END 

sqlfiddle to see trigger in action

+0

ありがとう、これは本当に必要なものではありません!問題は、別の行にある同じIDVU.IDの文字列を除外したいということです。何か案は? –

+0

[1](http://i.stack.imgur.com/KOdDs.png)これはおそらく私が欲しいものを説明するでしょう。私はトリガedit2を作成する! –

+0

私の答えは一番下に更新されました。試してみてください...私は 'numbers'テーブルを作成して、10行に分割することを可能にするために10を持つようにしました。 ...または3または4まで10.フィールドカウントのスペース+1の数をfield_countとしてカウントするので、これはちょっとダイナミックです。 –

関連する問題