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