Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Java MySQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败_Java_Mysql_Jdbc - Fatal编程技术网

Java MySQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败

Java MySQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败,java,mysql,jdbc,Java,Mysql,Jdbc,我已经探究了许多关于这个错误的问题和文档,似乎找不到哪里出了问题。错误在这一行: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`flutweets`.`refs`, CONSTRAINT `refs_ibfk_1` FOREIGN KEY (`id`

我已经探究了许多关于这个错误的问题和文档,似乎找不到哪里出了问题。错误在这一行:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 
Cannot add or update a child row: a foreign key constraint fails (`flutweets`.`refs`,    
CONSTRAINT `refs_ibfk_1` FOREIGN KEY (`id`) REFERENCES `tweets` (`id`))
数据库是MySQL,我正在使用Workbench检查它;我还知道所有的数据库引擎都是InnoDB,行格式也很紧凑。我有三个表:tweets、hashtags和references。 这里是我创建表的地方:

tweets Table

Statement stmt = null;
    try {
        stmt = connection.createStatement();
        stmt.executeUpdate("CREATE TABLE " + TWEETS_TABLE + "("
                + TWEETS_ID + " BIGINT NOT NULL AUTO_INCREMENT,"
                + TWEETS_TIME + " VARCHAR(255),"
                + TWEETS_USER + " VARCHAR(255),"
                + TWEETS_TEXT + " VARCHAR(255) NOT NULL,"
                + TWEETS_LOCATION + " VARCHAR(255),"
                + TWEETS_CITY + " VARCHAR(255),"
                + TWEETS_PROVINCE + " VARCHAR(255),"
                + TWEETS_COUNTRY + " VARCHAR(255),"
                + TWEETS_TIME_ZONE + " VARCHAR(255),"
                + TWEETS_LATITUDE + " DECIMAL(20,16),"
                + TWEETS_LONGITUDE + " DECIMAL(20,16),"
                + "PRIMARY KEY (" + TWEETS_ID + ")"
                + ")");
       . . .

hashtags Table

Statement stmt = null;
    try {
        stmt = connection.createStatement();
        stmt.executeUpdate("CREATE TABLE " + HASHTAG_TABLE + "("
                + HASHTAG_ID + " BIGINT NOT NULL AUTO_INCREMENT,"
                + HASHTAG_TEXT + " VARCHAR(255),"
                + TWEETS_ID + " BIGINT NOT NULL,"
                + "PRIMARY KEY (" + HASHTAG_ID + ")," 
                + "FOREIGN KEY (" + TWEETS_ID + ")"
                + "REFERENCES " + TWEETS_TABLE
                + "(" + TWEETS_ID + ")" 
                + ")");
      . . .

references Table

Statement stmt = null;
    try {
        stmt = connection.createStatement();
        stmt.executeUpdate("CREATE TABLE " + REF_TABLE + "("
                + REF_ID + " BIGINT NOT NULL AUTO_INCREMENT,"
                + REF_TEXT + " VARCHAR(255),"
                + TWEETS_ID + " BIGINT NOT NULL,"
                + "PRIMARY KEY (" + REF_ID + ")," 
                + "FOREIGN KEY (" + TWEETS_ID + ")"
                + "REFERENCES " + TWEETS_TABLE
                + "(" + TWEETS_ID + ")" 
                + ")");
以下是我用来插入的语句和插入它们的方法(我使用的是准备好的语句):

public void insertHashtag(FluTweet-tweet、int-hashIndex、Integer-tweetID){


我不知道这为什么不起作用,如果有任何帮助,我将不胜感激。正如我所说,我已经浏览了许多其他帖子,但找不到相关的帮助。

背景

我找到了我自己问题的答案。任何实际的数据库处理都没有问题。事实证明,当我传递id作为hashtags和references中的外来id时,我是从主类中的一个计数器获取id的;在主类中,每个新tweet都有一个数字,与每个hashtag和该t的引用一起weet,该外键将引用tweets表中的主键,该主键将自动递增

问题出在这里:

事实证明,MySQL在自动递增时是而不是零索引的;第一个值是零,然后是一,然后是二,等等。相反,它从一开始。因此,当我尝试用外键引用主键时,我分配的每个推文(外键)的计数器都从零开始与tweets表(主键)中的自动递增tweet id不正确匹配

因此,我总是一个接一个地离开


我希望这能帮助任何有类似问题的人。

背景

我找到了我自己问题的答案。任何实际的数据库处理都没有问题。事实证明,当我传递id作为hashtags和references中的外来id时,我是从主类中的一个计数器获取id的;在主类中,每个新tweet都有一个数字,与每个hashtag和该t的引用一起weet,该外键将引用tweets表中的主键,该主键将自动递增

问题出在这里:

事实证明,MySQL在自动递增时是而不是零索引的;第一个值是零,然后是一,然后是二,等等。相反,它从一开始。因此,当我尝试用外键引用主键时,我分配的每个推文(外键)的计数器都从零开始与tweets表(主键)中的自动递增tweet id不正确匹配

因此,我总是一个接一个地离开


我希望这可以帮助任何可能有类似问题的人。

如果我们没有设置有效的子类对象主键值,那么我们可以看到MySQLIntegrityConstraintViolationException。如果我们忽略子类对象的主键值,那么基于在hibernate pojo/hbm.xml文件一级缓存中设置的配置(会话)将其刷新到数据库中。

如果我们没有设置有效的子类对象主键值,那么我们可以看到MySQLIntegrityConstraintViolationException。如果我们忽略子类对象的主键值,那么基于在hibernate pojo/hbm.xml文件一级缓存(会话)中设置的配置将把它刷新到数据库中。

哪一行抛出异常?错误在我问题的最开始说明。对于这一行,在我的主类开始向数据库中插入推文时,立即抛出此错误。因此基本上是立即。我相信这有修复问题所需的所有信息。你确定吗
tweets
表中存在一行,其中
tweets\u id
与您试图添加的
references
行中的
tweets\u id
匹配?错误消息告诉您正试图添加/更新没有父记录的子记录(在
references
)(在
推文中
)存在。请查看我自己问题的答案。哪一行引发异常?错误在我问题的开头说明。对于这一行,当我的主类开始向数据库中插入推文时,立即引发此错误。因此基本上是立即。我相信这一行具有修复问题所需的所有信息。是吗u确保
tweets
表中存在一行,其中
tweets\u id
与您试图添加的
references
行中的
tweets\u id
匹配?错误消息告诉您正试图添加/更新没有父记录的子记录(在
references
)(在
推文中
)存在。请参阅我对自己问题的回答。
/* INITIALIZE PREPARED STATEMENTS */

// Tweets
private static final String TWEETS_INSERT = "INSERT INTO " + TWEETS_TABLE
        + " (" + TWEETS_TIME + ", " + TWEETS_USER + ", " + TWEETS_TEXT + ", " + TWEETS_LOCATION + ", " + TWEETS_CITY + ", " + TWEETS_PROVINCE + ", "
        + TWEETS_COUNTRY + ", " + TWEETS_TIME_ZONE + ", " + TWEETS_LATITUDE + ", " + TWEETS_LONGITUDE + ")"
        + " VALUES(?,?,?,?,?,?,?,?,?,?)";
private PreparedStatement tweetsStatement;

// Hashtags
private static final String HASHTAGS_INSERT = "INSERT INTO " + HASHTAG_TABLE
        + " (" + HASHTAG_TEXT + ", " + TWEETS_ID + ")" + " VALUES(?,?)";
private PreparedStatement hashStatement;

// References
private static final String REF_INSERT = "INSERT INTO " + REF_TABLE
        + " (" + REF_TEXT + ", " + TWEETS_ID + ")" + " VALUES(?,?)";
private PreparedStatement refStatement;
    // Pull all of the Hashtag's relevant elements.

    String hashText =  tweet.getHashtag(hashIndex);

    try {
        hashStatement.setString(1, hashText);
        hashStatement.setString(2, tweetID.toString());

        //INSERT HASHTAG INTO TABLE
        hashStatement.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
    }

}

public void insertReference(FluTweet tweet, int referenceIndex, Integer tweetID) {

    // Pull all of the Reference's relevant elements.

    String refText =  tweet.getReference(referenceIndex);

    try {
        refStatement.setString(1, refText);
        refStatement.setString(2, tweetID.toString());

        //INSERT REFERENCE INTO TABLE
        refStatement.executeUpdate();

    } catch (SQLException e) {
        e.printStackTrace();
    }

}