Ahoj
Narazil jsem na takovyto problem:
Na MySQL 5 mam tuto strukturu tabulek:
CREATE TABLE tabulka1 (
id INT UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT,
typ VARCHAR(30) NOT NULL,
id_tabulka2,
PRIMARY KEY (id),
FOREIGN KEY (id_tabulka2) REFERENCES id_tabulka2 (id_tabulka2)
) TYPE=INNODB;
CREATE TABLE tabulka2 (
id INT UNSIGNED UNIQUE NOT NULL AUTO_INCREMENT,
popis VARCHAR(30) NOT NULL,
PRIMARY KEY (id)
) TYPE=INNODB;
Pomoci java aplikace spolupracujici s MySQL pomoci JDBC volam tento prikaz,
ktery resi nasledujici:
Do tabulka1 vkladam zaznam. Cizi klic zjistuji takto: najdi id podle
zadaneho popisu, a pokud takovy popis neexistuje, vrat nejmensi id v
tabulce.
String prikaz =
"INSERT INTO tabulka1 (typ, cas, id_tabulka2) " +
"SELECT ?, NOW(), id_tabulka1 FROM tabulka2 WHERE jmeno = ? " +
"UNION " +
"SELECT ?, NOW(), MIN(id_tabulka1) FROM tabulka2 LIMIT 1";
preparedStatement = connection.prepareStatement(prikaz,
Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, "neco");
preparedStatement.setString(2, "popis");
preparedStatement.setString(3, "neco");
preparedStatement.executeUpdate();
Když tento prikaz volam na DB jinak nez pomoci JDBC, tak vse funguje bez
problemu.
Ale kdyz prikaz volam přes JDBC, tak dojde k této Exception:
Exception: java.sql.SQLException: Data truncated for column 'typ' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:946)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
at
com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement
.java:1160)
at
com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStateme
nt.java:685)
at
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1400)
at
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1314)
at
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1299)
Nenapada me, cim by to mohlo byt.