如何从表中删除行而不从参考表中删除一行?

问题描述:

当我尝试从表中删除一行company_catalog我不想删除引用表中的数据store_catalog。约束表store_catalog上删除任何行动,但服务器返回例外如何从表中删除行而不从参考表中删除一行?

org.hibernate.exception.ConstraintViolationException: could not execute statement 
.... 
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`practick`.`store_catalog`, CONSTRAINT `store_catalog_ibfk_2` FOREIGN KEY (`idGoodsOnFirm`) REFERENCES `company_catalog` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
    at com.mysql.jdbc.Util.getInstance(Util.java:381) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2019) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937) 
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1922) 
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:187) 
    ... 87 more 

DAOImpl:

@Override 
public void deleteGoods(CatalogCompany catalogCompany) throws SQLException { 
    Session session = null; 
    Transaction tx = null; 
    try { 
     session = this.sessionFactory.openSession(); 
     tx = session.beginTransaction(); 
     session.delete(catalogCompany); 
     tx.commit(); 
    } catch (Exception e) { 
     if (tx != null) 
      tx.rollback(); 
     e.printStackTrace(); 
    } finally { 
     if (session != null && session.isOpen()) 
      session.close(); 
    } 
} 

enter image description here

删除动作你是指的是在子表中级联。您不能从引用父表的子表中删除数据。考虑到您将留下孤立的数据,您将违反ACID原则,例如数据完整性。为了从父表中删除所需的行,您首先必须对表格进行反规范化(中断规范化)。

请参考以下链接:https://dba.stackexchange.com/questions/44956/good-explanation-of-cascade-on-delete-update-behavio

+0

谢谢回答,你可以有任何的例子)? – badCoder 2015-02-10 00:18:07