2

データベースの作成には MySQL 5.3.28 を使用しています。テーブルの 1 つが自分自身を参照していて、これは大きな苦痛です。最初に作成したコードは次のとおりです。

CREATE  TABLE IF NOT EXISTS `dhbpsychiatry`.`activity` (
`ActivityId` INT(11) NOT NULL AUTO_INCREMENT ,
`NeedsRepeating` BINARY(1) NULL DEFAULT NULL , 
`Prerequisition` INT(11) NOT NULL DEFAULT 0 ,
`ActivityName` VARCHAR(45) NOT NULL ,
`ActivityDescription` VARCHAR(45) NULL ,
 PRIMARY KEY (`ActivityId`) ,
 INDEX `Prerequisition` (`ActivityId` ASC) ,
 CONSTRAINT `Prerequisition`
 FOREIGN KEY (`ActivityId` ) 
 REFERENCES `dhbpsychiatry`.`activity` (`ActivityId` )

 ON DELETE NO ACTION
 ON UPDATE NO ACTION)

問題はもちろん、最初の行を作成することです。

INSERT INTO `dhbpsychiatry`.`activity` (`ActivityId`, `Prerequisition`,
`ActivityName`) VALUES (1, 1, 'No prerequisition');

戻り値

  ERROR 1452: Cannot add or update a child row: a foreign key constraint fails 

もっとシンプルにやっても同じ

INSERT INTO `dhbpsychiatry`.`activity` (`ActivityName`) 
VALUES ('No prerequisition');

デフォルト値の有無にかかわらず、FKをnull可能、null不可にする、すべての可能性を試したと思います...

少し掘り下げた後、私はうまくいくものを見つけました:

SET FOREIGN_KEY_CHECKS = 0;
Insert into activity (ActivityID, ActivityName) VALUES (0,'No prerequisition');
SET FOREIGN_KEY_CHECKS = 1;

そこで、ワークベンチでこれらの行を使用して新しい SQL スクリプトを作成しました。

そこで、ここで 2 つの質問があります。

  1. スクリプトなしで最初の行を追加するにはどうすればよいですか?

またはそれが不可能な場合

2 データベースのエンジニアリングを行うたびに、このスクリプトが実行されるように自動的に追加するにはどうすればよいですか?

4

1 に答える 1

1

インデックスと外部キーの定義が混乱しています。主な問題は、列ActivityIdがそれ自体を参照していることです。

これを試して:

CREATE  TABLE IF NOT EXISTS `dhbpsychiatry`.`activity` (
`ActivityId` INT(11) NOT NULL AUTO_INCREMENT ,
`NeedsRepeating` BINARY(1) NULL DEFAULT NULL , 
`Prerequisition` INT(11) NOT NULL DEFAULT 0 ,
`ActivityName` VARCHAR(45) NOT NULL ,
`ActivityDescription` VARCHAR(45) NULL ,
 PRIMARY KEY (`ActivityId`) ,
 INDEX `Prerequisition_idx` (`Prerequisition`) ,  --- changed the index name
                                                  --- and the indexed column

 CONSTRAINT `Prerequisition_fk`                   --- changed the constraint name

   FOREIGN KEY (`Prerequisition` )                --- main issue !! changed  
                                                  --- the referencing column
   REFERENCES `dhbpsychiatry`.`activity` (`ActivityId`)
     ON DELETE NO ACTION
     ON UPDATE NO ACTION
)
于 2012-04-18T12:39:23.343 に答える