- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在不更改父表的情况下更新子表。确切地说,我有带有 id-album 、 name 等的父表 Album 。然后我有带有 id-song 的 Song 表,id-album 是外键引用表 Album ,然后是列名等等。例如,我在同一张专辑中有 2 首歌:歌曲 1 和歌曲 2 我想做的是从专辑中删除歌曲。
首先是有可能做到,如果可以的话,我想听听您的建议。我试图更新数据库中的那一行以及我之前没有提到的 javafx 中的 tableView。请记住,如果那是该专辑中的最后一首歌,我需要删除该专辑,因为条件是这样的专辑只有在其中至少有一首歌时才会存在。
如果您需要更多信息,我会上传一些代码、信息或类(class)。提前致谢。
这些是创建表的查询。
private void createTableAlbum() throws SQLException {
Statement statement = conect.createStatement();
String query = "CREATE TABLE IF NOT EXISTS album("
+ "id_album INT NOT NULL AUTO_INCREMENT,"
+ "album_name VARCHAR(30) NOT NULL,"
+ "no_hours smallint NOT NULL,"
+ "publishing_year date NOT NULL,"
+ "PRIMARY KEY(id_album));";
statement.execute(query);
}
private void createTableSong() throws SQLException {
Statement statement = conect.createStatement();
String query = "CREATE TABLE IF NOT EXISTS song("
+ "id_song INT NOT NULL AUTO_INCREMENT,"
+ "id_album INT,"
+ "song_name VARCHAR(30) NOT NULL,"
+ "song_time smallint NOT NULL,"
+ "number_on_album smallint,"
+ "PRIMARY KEY(id_song),"
+ "FOREIGN KEY (id_album) REFERENCES album(id_album) ON DELETE CASCADE ON UPDATE NO ACTION);";
statement.execute(query);
}
public void updateSong(Song song, Album album) throws SQLException {
conect = db.openConnection();
PreparedStatement statement = conect.prepareStatement("UPDATE song"
+ " SET id_album = ?, song_name = ?, song_time = ?, number_on_album = ? WHERE id_song = ?;");
statement.setInt(1, album.getAlbumId());
statement.setString(2, song.getSongName());
statement.setShort(3, song.getSongTime());
statement.setShort(4, song.getNumberOnAlbum());
statement.setInt(5, song.getSongId());
statement.executeUpdate();
db.closeConnection();
}
我已经尝试过类似的方法,但它所做的是从数据库中删除该特定歌曲,并且它正在处理我在下面记下的约束错误。错误行在这里
pesmicaDao.updatePesmica(newPesmica);
Pesmica currentSong = tablePesmica.getSelectionModel().getSelectedItem();
if (currentSong == null) {
alert1.setContentText("You have to select row first");
alert1.showAndWait();
} else {
Album album = new Album();
album.setId_album(0);
short serialNumberOnAlbum = 0;
Pesmica newPesmica = new Pesmica(album, currentSong.getNaziv_pesme(), currentSong.getTrajanje(), serialNumberOnAlbum);
newPesmica.setId_pesme(currentSong.getId_pesme());
try {
pesmicaDao.updatePesmica(newPesmica);
} catch (SQLException ex) {
ex.printStackTrace();
}
int i = pesmica.indexOf(currentSong);
pesmica.removeAll(currentSong);
pesmica.add(i, newPesmica);
tablePesmica.getSelectionModel().clearSelection();
错误代码如下:
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`projekatbaze`.`pesmica`, CONSTRAINT `pesmica_ibfk_1` FOREIGN KEY (`id_album`) REFERENCES `album` (`id_album`) ON DELETE CASCADE ON UPDATE NO ACTION)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.Util.getInstance(Util.java:408)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2490)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
at Dao.classes.PesmicaDAO.updatePesmica(PesmicaDAO.java:49)
at Paneli.PregledPesamaPanel.lambda$start$6(PregledPesamaPanel.java:442)
解决方案:
我在这里找到了一些有用的建议,所以首先让我谢谢你,我很感激。那么现在我将用答案更新我的帖子,以便有类似问题的人可以发现这篇帖子有用。
public void updateSong(Song s) throws SQLException {
conect = db.openConnection();
PreparedStatement statement = conect.prepareStatement("UPDATE song"
+ " SET id_album = ?, naziv_pesme = ?, trajanje = ?, rb_na_albumu = ? WHERE id_song = ?;");
if (s.getAlbum().getId_album() == 0) {
statement = conect.prepareStatement("UPDATE song"
+ " SET id_album = null, naziv_pesme = ?, trajanje = ?, rb_na_albumu = null WHERE id_song = ?;");
statement.setString(1, s.getNaziv_pesme());
statement.setShort(2, s.getTrajanje());
statement.setInt(3, s.getId_song());
} else {
statement.setInt(1, s.getAlbum().getId_album());
statement.setString(2, s.getNaziv_pesme());
statement.setShort(3, s.getTrajanje());
statement.setShort(4, s.getRb_na_albumu());
statement.setInt(5, s.getId_song());
}
statement.executeUpdate();
db.closeConnection();
}
最佳答案
我认为我找到了解决方案,但我没有完整的源代码,所以我不确定是否是这个导致了你的问题。
问题是您在调用 album.setId_album(0);
然后,当您尝试更新行时,您没有任何 id 为 0 的相册,这会导致问题,而当使用 0 更新时,您可以检查该值是否为 0 并将准备好的语句中的 id_album 设置为 null(因为 int 可以'在 java 中为空),像这样:
if (p.getAlbum().getId_album() == 0) {
// set id_album value inside statement to null
statement = conect.prepareStatement("UPDATE song"
+ " SET id_album = null, song_name = ?, song_time = ?, number_on_album = ? WHERE id_song = ?;");
}
编辑:
我忘了说你仍然需要相应地设置其他值,也可能有更简洁的方法来做到这一点,但只是试着看看这是否是导致问题的原因。
关于java - 如何解决 "Cannot add or update a child row: a foreign key constraint fails",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48357462/
仍在习惯正则表达式中的环视,但似乎无法理解 \b(?>! key)foreign\b 要成为正确的解决方案?我试图在某些文本中找到所有外来词的实例,但不是外键或外键。 最佳答案 前瞻需要在 forei
我有一个外国表,例如: CREATE FOREIGN TABLE film ( id varchar(40) NOT NULL, title varcha
我的意思是例如我可以创建表 create table XTable ( idt int not null primary key, value nvarchar(50), idq int,
我有以下表格: 财务: PK_FinancialID FK_SchoolID 学校: PK_SchoolID 类: PK_ClassID FK_SchoolID 类(class)名 Class 和 F
我有一个旧数据库,我不能用每个实体中具有外键属性的两个实体更改它: EntityOne ForeignKey1 (pointing to EntityTwo.ForeignKey2) Enti
当我尝试运行代码时,出现此错误 Cannot add or update a child row: a foreign key constraint fails (hotel_info.results
好的,我尝试了这种从外国翻译过来的方法,它确实有效我在我的库中的 structs.lisp 文件中定义了这些,它在我所有其他依赖项之前首先加载 (cffi:defcstruct (cv-size :c
我有一个 Django 程序员的问题应该很简单,但目前我不知道如何解决。 我有这三个模型(我尽量简化): class Nations(models.Model): label = models
真的很讨厌占用别人的时间,但问题似乎并没有消失。 我考虑了 http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-t
我需要一双新的眼睛来看看我到底做错了什么。 CREATE TABLE IF NOT EXISTS `spring_normalize`.`users` ( `username` VARCHAR(6
我正在尝试在表中添加外键约束。我的表结构是:表请购单 我想在下一张表中添加申请表的外键 申请批准 当我尝试使用以下 SQL 查询添加外键约束时: ALTER TABLE `requisition_ap
每当我尝试将数据插入“学生”表时,都会收到此错误。下面是两个表,我使用的是MySql: 学生表: | Field | Type | Null | Key | Defaul
我收到错误代码 1215:无法为子表添加外键约束。父表具有复合主键。我想使用该复合主键作为子表中的外键。请指导我。 父表 CREATE TABLE health.procedures( Spe
var state = require('./state') module.exports = function (sequelize, DataTypes) { var city = seq
我可以通过 this case 部分解决这个问题 不幸的是,Preload() 函数似乎无法在相关对象集中进行更深入的研究。 澄清一下,我有以下模型: type Room struct {
我正在使用 Laravel 6。我创建了一些迁移,但我无法让它们成功运行。这些是我的迁移。 public function up() { Schema::create('nationa
这是我的总输出: Executing SQL script in server ERROR: Error 1215: Cannot add foreign key constraint CREATE
我有 postgres 数据库,我的应用程序是使用 django 构建的,我使用 south migration 来维护数据库模式。我有以下场景: user_table与userclickstream
简单的问题。只是想知道是否可以在不需要我在 Java 代码中手动强制执行此约束的情况下完成此操作。这两个外键(一起在同一个表中)都引用另一个表,但对于每一行,它们不得指向同一个外项。 link tex
我正在为我的模型关联使用 Sails 和 Waterline,但我不确定要做什么才能修复我在尝试更新 PageChild 对象时收到的错误。 module.exports = { tableN
我是一名优秀的程序员,十分优秀!