对数据库表的相关操作

        最近工作中遇到需要对数据库的表进行锁表以及修改表名,修改外键等的一些操作,所以总结了一下。在对表的操作时发现,虽然开启了事务,但是事务只对表中的数据有效,对表的一些操作是没有事务的。即:出现异常时表中数据会回滚,但是对表名等一些操作不会回滚。

1、修改表名

    <update id="updateDbName">
        alter table ${tableName} rename as ${copyTableName}
    </update>

2、锁表:sql最后加上 for update

    <select id="lockDynamicRegistry" resultMap="BaseResultMap">
        select
          *
        from dynamic_registry
        where
          id = #{id,jdbcType=BIGINT}
        for update  //进行锁表
    </select>

注意: for update 僅適用於 InnoDB,当for update的字段为索引或者主键的时候,只会锁住索引或者主键对应的行,即行锁;

而当for update的字段为普通字段的时候,Innodb会锁住整张表,即表锁;

3、删除外键

 <update id="exitConstraint">
        ALTER TABLE ip_in_progress    
        DROP foreign key server_progress
  </update>

//ip_in_progress:表名    
//server_progress:外键名

4、添加外键

    <update id="addConstraint">
        alter table interface_port_mapping
        add constraint server_mapping
        foreign key (server) references ip_in_progress(id)

     [ON DELETE { CASCADE|  SET NULL  |  NO ACTION  |  RESTRICT } ]  //删除时
     [ON UPDATE {  CASCADE |  SET NULL  |  NO ACTION  |  RESTRICT  } ]  //更新时
    </update>

格式:
   alter table 添加外键的表名
        add constraint 外键名
        foreign key (字段名) references 主表名(主表字段);
说明:
   ON DELETE/ ON UPDATE :用于定义delete,update操作的各种外键的约束类型:

 注:外键有五种约束类型:CASCADE、NO ACTION、RESTRICT、SET NULL和空。如图:

CASCADE: 在父表上update/delete记录时,同步update/delete掉子表的匹配记录

SET NULL :在父表上update/delete记录时,将子表上匹配记录的列设为null ,

要注意子表的外键列不能为not null,

NO ACTION:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作

RESTRICT: 也相当于NO ACTION,即不进行任何操作.即,拒绝父表update外键关联列,delete记录.

注:

1.若不声明on update/delete,则默认是采用RESTRICT方式.

2.对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式.

猜你喜欢

转载自blog.csdn.net/weixin_52540274/article/details/119803455