MySQL工作台 - 自我引用表和自定义脚本

时间:2012-04-18 12:27:45

标签: mysql mysql-workbench

我使用MySQL 5.3.28创建我的数据库。其中一个表是指自己,这是一个很大的痛苦。这是最初创建的代码:

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可以为空,不可为空,有或没有默认值......

挖了一点之后我发现了一些有用的东西:

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

所以我在workbench中用这些行创建了一个新的SQL脚本。

所以我在这里有两个问题:

  1. 如何在没有脚本的情况下添加第一行?
  2. 或者如果不可能

    2每当我设计数据库时,如何自动添加此脚本以执行?

1 个答案:

答案 0 :(得分:0)

您的索引和外键定义混淆了。主要问题是列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
)