Java 使用外键在表中输入数据时出现JDBC异常

Java 使用外键在表中输入数据时出现JDBC异常,java,mysql,jdbc,Java,Mysql,Jdbc,当我用java程序(简单字典)输入数据时,它会抛出一个错误: MySQLIntegrityConstraintViolationException:无法添加或更新 子行:外键约束失败(singlehawcard, 约束card\u ibfk\u 1外键(wordId)引用word (wordId)) 但当我在命令提示符下通过查询输入数据时,我不会遇到任何问题 我在这里发布我的方法: public boolean insert(Card card) { Connection connect

当我用java程序(简单字典)输入数据时,它会抛出一个错误:

MySQLIntegrityConstraintViolationException:无法添加或更新 子行:外键约束失败(
singlehaw
card
, 约束
card\u ibfk\u 1
外键(
wordId
)引用
word
wordId
))

但当我在命令提示符下通过查询输入数据时,我不会遇到任何问题

我在这里发布我的方法:

public boolean insert(Card card) {
    Connection connection = MySqlUtils.getInstance().getConnection();
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    int cardId = -1;
    try {
        String INSERT_INTO_TABLE_CARD_QUERY = "INSERT INTO "
                + TBL_CARD + " ("
                + STATUS + ", "
                + RATING + ", "
                + INSERT_TIME + ", "
                + DIC_ID + ", "
                + WORD_ID
                + ") VALUES (?,?,NOW(),?,?)";
        statement = connection.prepareStatement(INSERT_INTO_TABLE_WORDS_QUERY, Statement.RETURN_GENERATED_KEYS);
        statement.setString(1, card.getStatus().name());
        statement.setInt(2, card.getRating());
        statement.setInt(3, card.getDictionaryId());
        statement.setInt(4, card.getWordId());
        statement.execute();

        // get last inserted id
        resultSet = statement.getGeneratedKeys();
        if (resultSet.next())
            cardId = resultSet.getInt(1);
    } catch (SQLException e) {
        e.printStackTrace();
        return false;
    } finally {
        try {
            if (connection != null)
                connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    card.setCardId(cardId);
    return true;
}
以及创建表的脚本:

CREATE TABLE dictionary (
dictionaryId SERIAL,
dictionary VARCHAR(128) NOT NULL,
PRIMARY KEY (dictionaryId)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE word (
wordId SERIAL,
word VARCHAR(255) NOT NULL UNIQUE, 
transcription VARCHAR(255),
PRIMARY KEY (wordId)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE card (
cardId SERIAL,
status ENUM ('EDIT', 'POSTPONED', 'TO_LEARN', 'LEARNT') NOT NULL DEFAULT 'TO_LEARN',
rating TINYINT DEFAULT '0' NOT NULL,
insert_time TIMESTAMP DEFAULT NOW(),
update_time TIMESTAMP,
dictionaryId BIGINT UNSIGNED NOT NULL,
wordId BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (cardId),
FOREIGN KEY (wordId) REFERENCES word (wordId),
FOREIGN KEY (dictionaryId) REFERENCES dictionary (dictionaryId) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

您可以关闭约束、执行查询和打开约束

SET FOREIGN_KEY_CHECKS=0;
... here is your sql ...
SET FOREIGN_KEY_CHECKS=1;

您可以关闭约束、执行查询和打开约束

SET FOREIGN_KEY_CHECKS=0;
... here is your sql ...
SET FOREIGN_KEY_CHECKS=1;
也许,表上的wordID字段具有不同的数据类型这一事实正在影响您的程序。SERIAL是Bigint的别名。这个想法被抛弃了

在日志中的此处打印正在执行的实际语句。可能有些内容没有包括在内。

也许,表上的wordID字段具有不同的数据类型,这影响了您的程序。SERIAL是Bigint的别名。这个想法被抛弃了



在日志中的此处打印正在执行的实际语句。也许有些东西没有被包括在内。

Thnx的人很多。从这个话题上理解了很多东西。现在问题已经解决了。这个问题是由于通过JUnit测试填充表造成的,由于maven,我的测试顺序错误,所以很难识别真正的问题。

Thnx的家伙们很多。从这个话题上理解了很多东西。现在问题已经解决了。这个问题是由于通过JUnit测试填充表造成的,并且由于maven我的测试顺序错误,因此很难识别真正的问题。

作为急救,您可以生成最终查询的输出,将其复制到剪贴板,并直接在mySQL中调用它。如果您想确保所有事情都正常工作,这通常很有用。看起来您正试图通过java插入数据,该java引用了
word
表中不存在的单词。不确定这是关于语句还是关于插入的数据。Table word不是空的,对此我很确定,检查了很多次。如果它是空的,我将无法通过命令提示符输入数据。但是thx。我检查了在语句内部生成的查询,它实际上是正确的。作为急救,您可以生成最终查询的输出,将其复制到剪贴板,并直接在mySQL中调用它。如果您想确保所有事情都正常工作,这通常很有用。看起来您正试图通过java插入数据,该java引用了
word
表中不存在的单词。不确定这是关于语句还是关于插入的数据。Table word不是空的,对此我很确定,检查了很多次。如果它是空的,我将无法通过命令提示符输入数据。但是thx。我检查了在语句内部生成的查询,它实际上是正确的。在这种情况下,您可能会在数据库中存储不一致的数据。嗯。。。我认为你是对的。。。这种变体在另一种情况下可能会有所帮助—外键使用起来非常不愉快。当我用“外键”注释行并重新创建表时,程序开始正常工作。同时,我没有更改表word和表Card中列wordId的数据类型,而且我认为还有另一个问题。。即使我通过命令提示符将数据输入到表卡中,我也可以在表卡和字典为空时输入数据,所以没有任何ID。当子表指向父表中的任何内容时,在子表中输入id是否正确?在这种情况下,您可能会在数据库中存储不一致的数据。嗯。。。我认为你是对的。。。这种变体在另一种情况下可能会有所帮助—外键使用起来非常不愉快。当我用“外键”注释行并重新创建表时,程序开始正常工作。同时,我没有更改表word和表Card中列wordId的数据类型,而且我认为还有另一个问题。。即使我通过命令提示符将数据输入到表卡中,我也可以在表卡和字典为空时输入数据,所以没有任何ID。当id指向父表中的任何内容时,将id输入子表是否正确?