mysql 外键(foreign key)的详解和实例_MySQL在线ddl操作工具pt-osc

1、简介

pt-online-schema-change:在线修改表结构。

2、pt-osc的工作原理

1、创建一个和源表一样表结构的新表

2、在新表执行DDL语句

3、在源表创建三个触发器分别对应insert、update、delete操作

4、从源表拷贝数据到新表,拷贝过程中源表通过触发器把新的DML操作更新到新表中

5、rename源表到old表中,把新表rename为源表

6、删除源表

25a7f4dc9f0ff93db813ef0deb142386.png

3、使用说明

语法:pt-online-schema-change [OPTIONS] DSN

pt-online-schema-change常用参数

pt-online-schema-change --help
b439fef4d6c556a7d5feff6d14370cca.png

常用参数:

--host=xxx:连接数据库的host--user=xxx:用户名--password=xxx:密码--ask-pass:手动输入密码--alter:结构变更语句,不需要 ALTER TABLE关键字。用逗号分隔可以指定多个更改D=db_name,t=table_name:指定要ddl的数据库名和表名--print:打印执行的SQL语句--dry-run:创建和更改新表,但不要创建触发器,复制数据和替换原始表。并不真正执行,可以看到生成的执行语句,了解执行步骤--execute:确定修改表,真正执行alter--alter-foreign-keys-method=s      设置修改外键的方式,一共有如下4个值:      auto:优先选择rebuild_constraints方式处理外键,如果该方式不可用才选择drop_swap;      rebuild_constraints:在最后rename表后,删除子表上的外键,并进行重新建立到新表的外键。      drop_swap:拷贝数据后,设置SET foreign_key_checks=0,直接将原表drop掉,然后rename临时表为新表      none:表示强制不考虑子表外键约束,设置SET foreign_key_checks=0,最终会导致子表外键约束到_table_old这个已删除的表上,不建议使用--preserve-triggers:保留触发器,当原表有触发器时需要指定该选项

4、示例

1 打印执行信息

pt-online-schema-change --host=192.168.136.129 --port=3306 --user=test --ask-pass --alter "add column name3 varchar(20)" D=test,t=test_osc --print --dry-run

2 新增字段

pt-online-schema-change --host=192.168.136.129 --port=3306 --user=test --ask-pass --alter "add column name3 varchar(20)" D=test,t=test_osc --print --execute

3 删除字段

pt-online-schema-change --host=192.168.136.129 --port=3306 --user=test --ask-pass --alter "drop column name3" D=test,t=test_osc --print --execute

4 修改字段

pt-online-schema-change --host=192.168.136.129 --port=3306 --user=test --ask-pass --alter "modify column name3 varchar(30)" D=test,t=test_osc --print --execute

5 索引操作

pt-online-schema-change --host=192.168.136.129 --port=3306 --user=test --ask-pass --alter "drop key ix_name2,add key ix_name3(name3)" D=test,t=test_osc --print --execute

6 主键操作

pt-online-schema-change --host=192.168.136.129 --port=3306 --user=test --ask-pass --alter "drop primary key,add primary key(name2)" D=test,t=test_osc --print --execute --no-check-alter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 约束可以用来保证表与表之间的关系完整性。当我们在一个表中定义了一个,它会引用另一个表中的列,这个被引用的列必须是另一个表的主或者是一个唯一。在 MySQL 中,约束可以跨越多个列。 下面是一个例子,演示如何在 MySQL 中定义一个约束,跨越两个列: ``` CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, FOREIGN KEY (customer_id, order_date) REFERENCES customers(id, date) ); ``` 在这个例子中,orders 表中的 customer_id 和 order_date 列都被用来定义约束,它们分别引用了 customers 表中的 id 和 date 列。这个约束确保了 orders 表中的每一行都有对应的 customers 表中的行,而且这个关联是基于 customer_id 和 order_date 两列的值。 在定义约束时,我们还可以指定 ON DELETE 和 ON UPDATE 规则,用来控制当关联表中的某一行被删除或更新时,对应的行应该怎么处理。常用的规则包括: - CASCADE:当关联表中的某一行被删除或更新时,对应的行也会被删除或更新。 - RESTRICT:当关联表中的某一行被删除或更新时,如果该行有对应的行,则不允许删除或更新。 - SET NULL:当关联表中的某一行被删除或更新时,对应的行的列会被设置为 NULL。 我们可以在定义约束时使用这些规则,例如: ``` CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, order_date DATE, FOREIGN KEY (customer_id, order_date) REFERENCES customers(id, date) ON DELETE CASCADE ON UPDATE RESTRICT ); ``` 在这个例子中,我们指定了 ON DELETE CASCADE 和 ON UPDATE RESTRICT 规则,表示当 customers 表中的某一行被删除时,对应的 orders 表中的行也会被删除;当 customers 表中的某一行被更新时,只有当 orders 表中的行没有被引用时,才允许更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值