精华内容
下载资源
问答
  • 级联删除

    千次阅读 2016-11-10 13:13:03
    referenced_table_name:外键参考的主键表名称 ...SQL级联删除——删除主表同时删除从表——同时删除具有主外键关系的表 create table a ( id varchar(20) primary key, password var
    referenced_table_name:外键参考的主键表名称
    ref_name:外键要参考的表的主键列
    on delete:删除级联
    on update:更新级联
    SQL级联删除——删除主表同时删除从表——同时删除具有主外键关系的表
    create table a
    (
    id varchar(20) primary key,
    password varchar(20) not null
    )
    create table b
    (
    id int identity(1,1) primary key,
    name varchar(50) not null,
    userId varchar(20),
    foreign key (userId) references a(id) on delete cascade
    )
    表B创建了外码userId 对应A的主码ID,声明了级联删除

    测试数据:

    编辑
    insert a values ('11','aaa')
    insert a values('23','aaa')
    insert b values('da','11')
    insert b values('das','11')
    insert b values('ww','23')
    删除A表内id为‘11’的数据,发现B表内userId 为“11”也被数据库自动删除了,这就是级联删除
    delete a where id='11'
    展开全文
  • 本篇文章帮大家学习JPA级联删除,包含了JPA级联删除使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于...

    本篇文章帮大家学习JPA级联删除,包含了JPA级联删除使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。

    级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 -

    @OneToOne(cascade=CascadeType.REMOVE)

    JPA级联删除示例

    在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。

    这个例子包含以下步骤 -

    第1步: 在com.yiibai.jpa.student包下创建一个名为StudentEntity.java的实体类,其中包含属性:s_id,s_name,s_age以及标记为级联规范的Subject类型的对象。

    文件: StudentEntity.java -

    package com.yiibai.jpa.student;

    import javax.persistence.*;

    import com.yiibai.jpa.subject.Subject;

    @Entity

    @Table(name = "student")

    public class StudentEntity {

    @Id

    private int s_id;

    private String s_name;

    private int s_age;

    @OneToOne(cascade = { CascadeType.REMOVE })

    private Subject sub;

    public Subject getSub() {

    return sub;

    }

    public void setSub(Subject sub) {

    this.sub = sub;

    }

    public StudentEntity(int s_id, String s_name, int s_age, Subject sub) {

    super();

    this.s_id = s_id;

    this.s_name = s_name;

    this.s_age = s_age;

    this.sub = sub;

    }

    public StudentEntity() {

    super();

    }

    public int getS_id() {

    return s_id;

    }

    public void setS_id(int s_id) {

    this.s_id = s_id;

    }

    public String getS_name() {

    return s_name;

    }

    public void setS_name(String s_name) {

    this.s_name = s_name;

    }

    public int getS_age() {

    return s_age;

    }

    public void setS_age(int s_age) {

    this.s_age = s_age;

    }

    }

    第2步: 在com.yiibai.jpa.subject包下创建另一个名为Subject.java的实体类。

    文件:Subject.java -

    package com.yiibai.jpa.subject;

    import javax.persistence.*;

    @Entity

    @Table(name = "subject")

    public class Subject {

    private String name;

    private int marks;

    @Id

    private int s_id;

    public Subject(String name, int marks, int s_id) {

    super();

    this.name = name;

    this.marks = marks;

    this.s_id = s_id;

    }

    public Subject() {

    super();

    }

    public String getName() {

    return name;

    }

    public void setName(String name) {

    this.name = name;

    }

    public int getMarks() {

    return marks;

    }

    public void setMarks(int marks) {

    this.marks = marks;

    }

    public int getS_id() {

    return s_id;

    }

    public void setS_id(int s_id) {

    this.s_id = s_id;

    }

    }

    现在,将实体类和其他数据库配置映射到persistence.xml文件中。

    文件:persistence.xml -

    xmlns="http://xmlns.jcp.org/xml/ns/persistence"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">

    com.yiibai.jpa.student.StudentEntity

    com.yiibai.jpa.subject.Subject

    value="com.mysql.jdbc.Driver" />

    value="jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC" />

    value="123456" />

    value="create-or-extend-tables" />

    在com.yiibai.jpa.cascade包下创建一个名为StudentCascade.java的持久化类,以便将实体对象与数据保持一致。

    文件:StudentCascade.java -

    package com.yiibai.jpa.cascade;

    import javax.persistence.*;

    import com.yiibai.jpa.student.*;

    public class StudentCascade {

    public static void main(String[] args) {

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("Student_details");

    EntityManager em = emf.createEntityManager();

    em.getTransaction().begin();

    StudentEntity s = em.find(StudentEntity.class, 101);

    em.remove(s);

    em.getTransaction().commit();

    em.close();

    emf.close();

    }

    }

    注 - student表中的主键(即s_id)将作为subject表中的外键处理,以维持两个表之间的关系。

    输出结果

    程序执行完毕后,在MySQL工作台下生成以下表格。

    student表 - 要获取数据,在MySQL中运行select * from student。得到结果如下 - mysql> select * from student;

    +------+-------+--------+----------+

    | S_ID | S_AGE | S_NAME | SUB_S_ID |

    +------+-------+--------+----------+

    | 102 | 22 | James | 102 |

    +------+-------+--------+----------+

    1 rows in set

    subject表 - 要获取数据,在MySQL中运行select * from subject。得到结果如下 - mysql> select * from subject ;

    +------+-------+---------+

    | S_ID | MARKS | NAME |

    +------+-------+---------+

    | 102 | 75 | Maths |

    +------+-------+---------+

    1 rows in set

    展开全文
  • SQl语句的级联删除问题删除应该有顺序1,删除link表delete from ref,link where ref.link_code=link.link_code and link_id=?delete from link where link_id=?2,删除plan表delete from ref,plan where ref.plan_...

    SQl语句的级联删除问题

    删除应该有顺序

    1,删除link表

    delete from ref,link where ref.link_code=link.link_code and link_id=?

    delete from link where link_id=?

    2,删除plan表

    delete from ref,plan where ref.plan_code=plan.plan_code and plan_id=?

    delete from plan where plan_id=?

    SQL 怎幺级联删除语句

    方法一:

    MSSQLSERVER是支持级联更新和级联删除的,你要在建立外键的时候,要指定

    EP:

    alter table tb_userroles

    add constraint FK_TB_USERR_RELATIONS_TB_FUNCT foreign key (gnbm)

    references tb_function (gnbm)

    on update cascade on delete cascade

    方法二:用数据库触发器

    sql如何通过外键约束实现级联删除和更新

    设定外键为级联删除就可以了。

    alter table B add constraint fk_ID foreign key (ID) references A(ID) on delete cascade;

    这样只需:delete from A where ID=nnnn; 就可以自动删除对应B表内容了。

    通过外键无法实现同步更新。

    sql中级联删除,级联更新是怎幺理解的?

    级联删除你可以把它认为是一个触发器,也就是你删除主表中的数据,那幺从表中的相关联的也就一起删除了。。。看个例子:======================create table a

    (

    id varchar(20) primary key,

    password varchar(20) not null

    )

    create table b

    (

    id int identity(1,1) primary key,

    name varchar(50) not null,

    userId varchar(20),

    foreign key (userId) references a(id) on delete cascade

    )

    表B创建了外码userId 对应A的主码ID,声明了级联删除

    测试数据:

    insert a values ('11','aaa')

    insert a values('23','aaa')

    insert b values('da','11')

    insert b values('das','11')

    insert b values('ww','23')

    删除A表内id为‘11’的数据,发现B表内userId 为“11”也被数据库自动删除了,这就是级联删除

    delete a where id='11'=============================================================级联更新也大同小异。。只是关键字为:on update希望回答对你有所帮助........

    sql server中如何级联删除?

    可以用下边的方法,仅供参考:

    --?创建测试主表.?ID?是主键.

    CREATE?TABLE?test_main?(

    id??????INT???NOT?NULL,

    value???VARCHAR(10),

    PRIMARY?KEY(id)

    );

    --?创建测试子表.

    CREATE?TABLE?test_sub?(

    id??????INT??NOT?NULL,

    main_id?INT?,

    value???VARCHAR(10),

    PRIMARY?KEY(id)

    );

    --?插入测试主表数据.

    INSERT?INTO?test_main(id,?value)?VALUES?(1,?'ONE');

    INSERT?INTO?test_main(id,?value)?VALUES?(2,?'TWO');

    --?插入测试子表数据.

    INSERT?INTO?test_sub(id,?main_id,?value)?VALUES?(1,?1,?'ONEONE');

    INSERT?INTO?test_sub(id,?main_id,?value)?VALUES?(2,?2,?'TWOTWO');

    然后,创建外键,使用?ON?DELETE?CASCADE?选项,删除主表的时候,同时删除子表

    ALTER?TABLE?test_sub?ADD?CONSTRAINT?main_id_cons?FOREIGN?KEY?(main_id)??REFERENCES??test_main??ON?DELETE?CASCADE;

    执行删除:

    DELETE?FROM?TEST_MAIN?WHERE?ID?=?1;

    最后:

    SELECT?*?FROM?TEST_MAIN;

    结果子表中就只有ID=2的记录,也就说明级联删除成功。

    SQL 怎幺级联删除语句???

    方法一:

    MSSQLSERVER是支持级联更新和级联删除的,你要在建立外键的时候,要指定

    EP:

    alter table tb_userroles

    add constraint FK_TB_USERR_RELATIONS_TB_FUNCT foreign key (gnbm)

    references tb_function (gnbm)

    on update cascade on delete cascade

    方法二:用数据库触发器

    SQL server中怎幺修改级联删除修改

    在创建表的时候就需要设置级联删除和级联更新(修改)。方法如下:

    alter?table?SZ_Picture

    add?constraint?FK_SZ_PICTU_RELATIONS_SZ_PICTU?foreign?key?(pictureTypeId)

    references?SZ_PictureType?(pictureTypeId)

    on?update?cascade?on?delete?cascade?--其中这句就是级联更新和级联删除

    级联删除:

    删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。

    级联更新:

    更新主键值的操作,该值由其它表的现有行中的外键列引用。在级联更新中,更新所有外键值以与新的主键值相匹配。

    如何实现SQL与Oracle外键约束中的级联删除的方法

    系统中要删除一条记录,就要关联到同时删除好多张表,它们之间还存在着约束关系.所以考虑到在创建表时加上约束关系,详细内容如下:

    SQL的外键约束可以实现级联删除与级联更新;

    ORACLE则只充许级联删除。

    SQL级联删除与级联更新使用格式:

    CREATE TABLE A001(ID INT PRIMARY KEY,NAME VARCHAR(20))

    CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE ON UPDATE CASCADE,AGE TINYINT)

    ORACLE级联删除使用格式:

    CREATE TABLE A001(ID INT PRIMAY KEY,NAME VARCHAR2(20))

    CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE,AGE NUMBER(2,0))

    --------------

    CREATE TABLE groups

    (

    id VARCHAR2(16) CONSTRAINT pk_groupid PRIMARY KEY,

    name VARCHAR2(32),

    description VARCHAR2(50)

    )

    TABLESPACE userspace;

    CREATE TABLE usringrp

    (

    group_id VARCHAR2(16) CONSTRAINT fk_uing_grpid

    REFERENCES groups(id)

    ON DELETE CASCADE,

    user_id VARCHAR2(16)

    )

    TABLESPACE userspace;

    ---------------

    PowerDesigner

    参照完整性约束

    来源:([blog.sina.空白.空白]) - SQL与Oracle外键约束中的级联删除_点点_新浪博客

    限制(Restrict)。不允许进行修改或删除操作。若修改或删除主表的主键时,如果子表中存在子记录,系统将产生一个错误提示。这是缺省的参照完整性设置。

    置空(Set Null)。如果外键列允许为空,若修改或删除主表的主键时,把子表中参照的外键列设置为空值(NULL)。

    置为缺省(Set Default)。如果指定了缺省值,若修改或删除主表的主键时,把子表中参照的外键设置为缺省值(Default)。

    级联(Cascade)。把主表中主键修改为一个新的值时,相应修改子表中外键的值;或者删除主表中主键的记录时,要相应删除子表中外键的记录。

    注意:在oracle中建立好的constraint (包括primay key,foreign key) 如果要修改,必须先alter table drop contraint con_name;然后再重新add constraint

    oracle 创建表 时设置 级联删除和级联更新 的语句

    外键只能是参照表的主键,所以应该参照userid,要参照uname只能用触发器。

    create table users (userid primary key,uname unique)

    go

    create table board (bid primary key,bhost, foreign key(bhost) references users(userid) on delete CASCADE on update CASCADE)

    sql语句从主表删除一条数据,并且把先关联的多个子表数据也删除

    DELETE FROM table WHERE date in('c','e','f')

    *

    结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;

    *

    用外键关联删除,把B表的uid设成外键关联A表的ID,并关联删除操作。

    *

    用存储过程,用事务来处理实现。

    *

    创建数据库:CREATE DATABASE database-name删除数据库

    *

    drop database dbname

    *

    创建新表create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

    *

    删除新表:drop table tabname

    *

    增加一个列:Alter table tabname add column col type

    *

    添加主键:Alter table tabname add primary key(col)

    *

    删除主键:Alter table tabname drop primary key(col)

    *

    创建索引:create [unique] index idxname on tabname(col….)

    *

    删除索引:drop index idxname

    *

    创建视图:create view viewname as select statement

    *

    删除视图:drop view viewname

    展开全文
  • v在数据库中,新闻受新闻类型外键约束,并可以级联删除v在Hibernate中,实现级联删除vjkakfl(一)创建数据库表和关系DROPTABLENewsType;CREATETABLE NewsType(TypeIDNUMBER(10) PRIMARY KEYNOT NULL,TypeNameVARCHAR....

    我的使用背景:

    v

    有新闻和新闻类型,一条新闻只能属于一个类型,一种新闻类型可以对应多条新闻。

    v

    在数据库中,新闻受新闻类型外键约束,并可以级联删除

    v

    Hibernate

    中,实现级联删除

    v

    jkakfl

    (一)

    创建数据库表和关系

    DROPTABLENewsType;

    CREATETABLE NewsType

    (

    TypeIDNUMBER(10) PRIMARY KEYNOT NULL,

    TypeNameVARCHAR2(400) NOT NULL,

    DirNameVARCHAR2(400) NOT NULL,

    TemplateName VARCHAR2(400) NOT NULL

    );

    DROPSEQUENCE NEWSTYPE_SEQ;

    CREATESEQUENCE NEWSTYPE_SEQINCREMENT BY 1 START WITH 1;

    DROPTABLENews;

    CREATETABLENews

    (

    NewsIDNUMBER(10) PRIMARY KEY NOT NULL,

    TypeIDNUMBER(10) NOT NULL,

    TitleVARCHAR2(400) NOT NULL,

    HitCount NUMBER(10) DEFAULT0 NOT NULL,

    IssuseDateDATE NOT NULL,

    DeployerIDNUMBER(10) NOTNULL,

    OriginVARCHAR2(400)NOTNULL,

    URLVARCHAR2(400) NOT NULL,

    KEYWORDS VARCHAR(400) ,

    PriorityNUMBER(10)DEFAULT0 NOT NULL,

    SpecialVARCHAR2(400) ,

    DescriptionVARCHAR2(400),

    AuthorVARCHAR2(400),

    TopicVARCHAR2(400)

    );

    DROP SEQUENCE NEWS_SEQ;

    CREATE SEQUENCE NEWS_SEQINCREMENT BY1 START WITH 1;

    8795159bf3ed3ddd64334d54bd6d3213.png

    oralce

    中,设置数据表的约束关系如下图:

    (二)

    实现数据表到

    POJO

    的映射

    映射类,我们略去,此处主要显示配置文件

    ü

    News.hbm.xml

    /p>

    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

    NEWS_SEQ

    ü

    Newstype.hbm.xml

    /p>

    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

    cascade="all-delete-orphan"

    inverse="true">

    其实这是个双向以对多关系。

    (三)

    DAO

    中实现级联删除

    //

    删除新闻类型记录

    dao.getNewsTypeDAO().deleteObjects(typeIDs);

    typeID

    是新闻类型的主键

    执行此操作将会删除所有此新闻类型的新闻。

    news

    是一个

    Set

    类型的变量,用来存放此类型的所有的新闻。

    (四)

    删除时遇到的问题

    在数据库中,如果设置了约束关系,那么一定要允许级联删除,否则,你在执行删除时会抛出异常。

    如果我们的数据库关系设置如下:

    32d96665c33bdd436dfa13f50cc92948.png

    画圈的那个选项没有选上的话

    ,那么我们在执行的时候就会抛出如下的异常:

    006-04-06 13:20:16 ERROR [http-8080-Processor23] (JDBCExceptionReporter.java:72

    - ORA-02292:

    违反完整约束条件

    (SC.NEWS_TYPE_RELATIONS) -

    已找到子记录日志

    rg.hibernate.exception.ConstraintViolationException: could not execute update q

    ery

    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.j

    va:69)

    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelp

    r.java:43)

    at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:8

    )

    问题的关键在如下两点:

    1.

    数据库中要允许数据表的级联删除

    2.

    在映射文件中要将级联删除配置正确

    |----------------------------------------------------------------------------------------|

    版权声明  版权所有 @zhyiwww

    引用请注明来源 http://www.blogjava.net/zhyiwww

    |----------------------------------------------------------------------------------------|

    posted on 2006-04-06 14:12 zhyiwww 阅读(24271) 评论(6)  编辑  收藏 所属分类: j2ee

    展开全文
  • 需求描述今日需求是删除资源时同时删除与该资源绑定的角色数据,有两张表,资源表、角色与资源绑定表,级联删除的时候有两种方法:①建立表时直接建立约束,当父表删除数据时数据库会自动去删除子表中的数据,②通过代码...
  • /*用触发器来实现级联更新级联删除*/--创建学生表,课程表,学生课程表--http://www.yaosansi.com/post/692.html范本:触发器方式:create trigger trg_Aon Afor update,deleteasbeginif exists(select 1 from ...
  • 众所周知,数据库软件有级联删除和更新的功能。所谓级联删除和更新是说,如果两个表之间使用了主键与外键的关系约束,当对主键表的记录进行更新或者删除操作时,如果是更新,则自动将外键表的记录自动更新,如果是...
  • 里整理了Oracle中的三种级联操作,其中Oracle定义外健的时候可以定义级联删除,但是没有级联修改的语法,当然可以用触发器实现,下面我们详细来看Oracle数据库中的级联查询、级联删除、级联更新操作教程
  • 父子表都没有级联的约束,也没有添加外键,为什么我修改父表的主键,子表对应的纪录就会删除?还是说这不算级联删除
  • SQL 级联删除与级联更新的方法,需要的朋友可以参考一下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,415
精华内容 1,766
关键字:

级联删除