2016-11-29 9 views
1

私は2つのテーブル、テーブル(ファイル)とテーブル(ハッシュ)が存在しない場合は(ハッシュ)を追加する新しい(ファイル)を挿入するプロシージャを作成したいと思うし、(ID)テーブルが存在する場合は(ID)を選択して挿入してください。(ファイルトリガーを挿入する前に)使用する必要がありますが、CONSTRAINTエラーまたは挿入されたファイルがありません。その下のようなあなたのトリガでトリガーを挿入する前に?

CREATE TABLE `Hashes` (
    `ID` int(255) unsigned NOT NULL AUTO_INCREMENT, 
    `Hash` varchar(255) NOT NULL, 
    `Counter` int(255) NOT NULL DEFAULT '1', 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `Hash` (`Hash`) 
) 

CREATE TABLE `Files` (
    `ID` int(255) unsigned NOT NULL AUTO_INCREMENT, 
    `Name` varchar(255) NOT NULL, 
    `ParentPath` varchar(255) DEFAULT NULL, 
    `Size` double NOT NULL, 
    `Date` date NOT NULL, 
    `ParentID` int(255) unsigned NOT NULL DEFAULT '0', 
    `HashID` int(255) unsigned DEFAULT NULL, 
    PRIMARY KEY (`ID`), 
    KEY `fk_Hash_ID` (`HashID`), 
    CONSTRAINT `fk_Hash_ID` FOREIGN KEY (`HashID`) REFERENCES `hashes` (`ID`) 
) 

//////// 
CREATE PROCEDURE SP_Files_Insert 
(      
parmName VARCHAR(255),     
parmParentPath VARCHAR(255),   
parmSize DOUBLE, 
parmDate DATE, 
parmParentID INTEGER, 
parmHash VARCHAR(255) 
) 
BEGIN 

    INSERT INTO Files(Name, ParentPath, Size, Date, ParentID, HashID) 
    VALUES(parmName, parmParentPath, parmSize, parmDate, parmParentID, LAST_INSERT_ID()); 

END; 

//////////// 
CREATE TRIGGER TR_Insert_File BEFORE INSERT ON Files 
FOR EACH ROW 
BEGIN 

    INSERT INTO Hash(Hash, Counter) 
    VALUE(parmHash, 1) 
    ON DUPLICATE KEY UPDATE ID = LAST_INSERT_ID(ID), Counter = Counter + 1; 

END; 
+0

たちが追加または子の行を更新することはできませんあなたの完全なエラーメッセージ –

+0

をお知らせするために動作します:外部キー制約が失敗しました( 'cloudimagesdb'.files'、CONSTRAINT'fk_Hash_ID')外部キー(' HashID')参照 'ハッシュ'( 'ID')ON更新カスケード) – user3552185

+0

あなたのエラーメッセージは、 fk関係を最初に作成するか、または外部キーを無効にする必要があります。外部キーを無効にするにはSET FOREIGN_KEY_CHECKS = 0;外部キーを有効にするにはSET FOREIGN_KEY_CHECKS = 1; –

答えて

0

使用区切り文字を使用すると、

delimiter \\ 
CREATE TRIGGER TR_Insert_File BEFORE INSERT ON Files 
FOR EACH ROW 
BEGIN 

    INSERT INTO Hash(Hash, Counter) 
    VALUE(parmHash, 1) 
    ON DUPLICATE KEY UPDATE ID = LAST_INSERT_ID(ID), Counter = Counter + 1; 

END\\ 
delimiter ; 
+0

問題はデリミタとは何の関係もなく、ありがとうございました – user3552185

+0

独自のキーを作成しましたか?エラーメッセージを知らせてください –

+0

トリガーではなく、私はそれをNEW.Hashに置き換えましたが、私を抱きしめてくれました(ハッシュは新しく見つからない)!! – user3552185

関連する問題