2

Java プログラム (単純な辞書) でデータを入力すると、エラーがスローされます。

MySQLIntegrityConstraintViolationException: 子行を追加または更新できません: 外部キー制約が失敗しました ( singlehaw. card, CONSTRAINT card_ibfk_1FOREIGN KEY ( wordId) REFERENCES 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;
4

3 に答える 3

0

おそらく、テーブルのwordIDフィールドのデータ型が異なるという事実がプログラムに影響を与えています。SERIALはBigintのエイリアスです。アイデアは破棄されました。

実行されている実際のステートメントをログに出力します。含まれていないものがあるかもしれません。

于 2013-01-24T17:09:49.147 に答える
0

Thnxみんなたくさん。このトピックから多くのことを理解しました。今のところ問題はなくなりました。この問題は、JUnit テストを介してテーブルにデータを入力したことが原因であり、maven のためにテストの順序が間違っていたため、実際の問題を認識するのが困難でした。

于 2013-01-27T00:47:10.347 に答える
-1

制約をオフにして、クエリを実行し、制約をオンにすることができます。

SET FOREIGN_KEY_CHECKS=0;
... here is your sql ...
SET FOREIGN_KEY_CHECKS=1;
于 2013-01-24T15:42:07.100 に答える