Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL工作台-自引用表和自定义脚本_Mysql_Mysql Workbench - Fatal编程技术网

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

MySQL工作台-自引用表和自定义脚本,mysql,mysql-workbench,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

我使用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可以为null,而不是null,无论有没有默认值

经过一番挖掘,我发现了一些有效的方法:

SET FOREIGN_KEY_CHECKS = 0;
Insert into activity (ActivityID, ActivityName) VALUES (0,'No prerequisition');
SET FOREIGN_KEY_CHECKS = 1;
所以我在workbench中用这些行创建了一个新的SQL脚本

所以我这里有两个问题:

  • 如何在没有脚本的情况下添加第一行
  • 如果不可能的话


    2我如何自动添加此脚本,以便在我对数据库进行正向工程时执行?

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

    “我想我已经尝试了所有的可能性,使FK可以为null,而不是null,有或没有默认值……”听起来你只是在随机地尝试一些事情,没有逻辑地思考这个问题!经过几个小时的寻找解决方案,你开始怀疑是你的字体大小的错误,lol;)但说真的,更改“null”和“default value”看起来是朝着正确方向迈出的一步。不管怎么说,一切都解决了。Thx,它似乎起作用了!虽然我无法在不更改SQL语句的情况下更改索引的名称(这是我试图避免的),但我所要做的就是更改外键的引用。我怎么会错过呢?@Kris:你也可以在Workbench中更改索引和约束名称。是的,你可以,但在运行正向工程后,它们会返回默认名称。无论如何,这是没有必要的。