2016-04-20 16 views
0

テーブル内のテーブル(技術的および問題)との関係は、他のテーブルの技術が選択されている3つの状態(in、waiting、out)です。SQL外部キー(子行を追加または更新できません)

Relation

問題は、私は技術者のIDを変更しようとすると、私に次のエラーを与えることである。

#1452 - Cannot add or update a child row: a foreign key constraint fails (`demo_stack`.`problem`, CONSTRAINT `problem_ibfk_1` FOREIGN KEY (`technical_id_in`) REFERENCES `technical` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) 

アップデート:

UPDATE `technical` SET `id` = '14' WHERE `technical`.`id` = 1 

テーブル:

CREATE TABLE technical (
    id INT NOT NULL AUTO_INCREMENT, 
    name varchar(255), 
    PRIMARY KEY (id) 
) ENGINE=INNODB; 

CREATE TABLE problem (
    id INT, 
    name varchar(255), 
    technical_id_in INT, 
    technical_id_waiting INT, 
    technical_id_out INT, 
    INDEX (technical_id_in,technical_id_waiting,technical_id_out), 
    FOREIGN KEY (technical_id_in) REFERENCES technical(id) ON UPDATE CASCADE ON DELETE CASCADE, 
    FOREIGN KEY (technical_id_waiting) REFERENCES technical(id) ON UPDATE CASCADE ON DELETE CASCADE, 
    FOREIGN KEY (technical_id_out) REFERENCES technical(id) ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE=INNODB; 

INSERT INTO `technical` (`id`, `name`) VALUES ('1', 'victor'), ('2', 'eduardo'), ('3', 'jose'); 

INSERT INTO `problem` (`id`, `name`, `technical_id_in`, `technical_id_waiting`, `technical_id_out`) VALUES ('1', 'Problem 1', '1', '2', '1'), ('2', 'Problem 2', '1', '1', '1'); 

誰もが考えている?ありがとう!!!

+0

なぜ行の番号を変更しようとしますか?あなたは問題が 'technical'を参照しているのでエラーが発生します。' id' = 14. – jarlh

+0

はい、私は技術的な変更のID、他のテーブルもIDを変更するときにしたいです... –

答えて

0

MySql reference manualの提案:

START TRANSACTION; 
SET foreign_key_checks = 0; 
UPDATE technical SET id = 14 WHERE ID = 1; 
UPDATE problem SET technical_id_in = 14 WHERE technical_id_in = 1; 
UPDATE problem SET technical_id_waiting = 14 WHERE technical_id_waiting = 1; 
UPDATE problem SET technical_id_out = 14 WHERE technical_id_out = 1; 
SET foreign_key_checks = 1; 
COMMIT TRANSACTION; 
-- or "ROLLBACK TRANSACTION" if anything fails 

あなたは自分ですべての外部キーを更新する必要があります。

また、トランザクション内でこのスクリプトを実行し、何かが失敗した場合にトランザクションをロールバックすることを確認してください。

関連する問題