簡體   English   中英

MySQLIntegrityConstraintViolationException:無法添加或更新子行:外鍵約束失敗

[英]MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails

我已經探究了很多有關此錯誤的問題和文檔,但似乎找不到我要去哪里。 錯誤在此行上:

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,行格式很緊湊。 我有三個表:tweet,主題標簽和引用。 這是我創建表的地方:

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 + ")" 
                + ")");

這是我用來插入的語句和插入它們的方法(我正在使用准備好的語句):

/* 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;

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

    // 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();
    }

}

我不知道為什么這不起作用,任何幫助將不勝感激。 就像我說的,我已經探究了許多其他帖子,但是找不到相關的幫助。

背景

我找到了自己問題的答案。 任何實際的數據庫處理都從來沒有問題。 事實證明,當我將ID用作標簽和引用中的外來ID時,我是從主類的計數器獲取ID的。 每個新的推文都有一個數字,該數字與每個#標簽和該推文的引用一起用作后來的外鍵。 該外鍵將引用tweets表中的主鍵,該表會自動遞增。

問題出在這里:

事實證明,當您自動增加MySQL時,索引不會為零。 其中第一個值是零,然后是一個,然后是兩個,依此類推。相反,它從1開始。 因此,當我嘗試使用外鍵引用主鍵時,針對我分配的每個推文(外鍵)從零開始的計數器與推文表(主鍵)中的自動遞增推文ID不正確匹配。

因此,我總是一個人離開。

我希望這對可能遇到類似問題的任何人有所幫助。

如果未設置有效的子類對象主鍵值,則可以看到MySQLIntegrityConstraintViolationException。如果忽略子類對象的主鍵值,則基於hibernate pojo / hbm.xml文件一級緩存中設置的配置(會話)將其刷新到數據庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM