MySQL数据库(十五)__2018.11.18

动态添加和删除外键:

动态删除外键:alter tb_name drop foreign key fk_name;

这样就把外键删除了。

动态添加外键:alter table tb_name add foreign key (外键字段) references 主表(主键字段);

动态添加外键之前必须保证表中的记录一定是合法的记录,没有脏值,否则外键是不能添加成功的。

#删除外键
ALTER TABLE news
DROP FOREIGN KEY cateId_fk_newsCate;

#动态添加外键
ALTER TABLE news
ADD FOREIGN KEY(cateId)REFERENCES news_cate(id);

按照指定名称创建外键

#删除外键
ALTER TABLE news 
DROP FOREIGN KEY news_ibfk_1;

ALTER TABLE news
ADD CONSTRAINT cateId_fk_newCate FOREIGN KEY(cateId)REFERENCES news_cate(id);

接下下来我们测试,数据表中有脏数据的时候,添加外键约束的这么一个情况。首先我们先删除外键。

INSERT news_Cate(cateName)VALUES('国内新闻'),
('国际新闻'),
('娱乐新闻'),
('体育新闻');
 
INSERT news(title,content,cateId)VALUES('a1','aaaa1',1),
('a2','aaaa2',1),
('a3','aaaa3',4),
('a4','aaaa4',2),
#插入一个脏数据
('a5','aaaa5',8);

ALTER TABLE news
ADD FOREIGN KEY(cateId)REFERENCES news_cate(id);

建表时可以指定外键的一个参照操作,也就是说当父表发生一些更新操作,子表的外键约束怎样改变。

外键约束的参照操作:

1.cascade:代表级联的,当我们从父表进行一些删除或更新操作,那我们的子表也会跟着对应的记录对应的字段做更新或删除操作。相当于“株连九族”。从父表删除或更新,子表也跟着删除或者更新,级联的操作。

2.set null:代表的是,当我们要删除或更新行的时候,会把子表中对应的这样一个外键列置空(设为NULL,需要保证字表的外键列允许为空)。

3.no action | restrict:拒绝对父表做更新或者删除操作。

#指定级联操作 delect cascade update cascade
ALTER TABLE news
ADD FOREIGN KEY(cateId)REFERENCES news_cate(id)
ON DELETE CASCADE ON UPDATE CASCADE;

UPDATE news_cate SET id=11 WHERE id=1;

子表分类id也会跟着父表改过来

当删除父表中的这一条记录时,子表中的这条记录也会被删除。

这就是级联的删除和更新。包括set NULL也是一样的,不过你得保证建表时该字段是允许为NULL的。否则是写入不了的。

上面我们的这些外键都是逻辑上的外键,当然以后我们在程序端,保证数据的完整性和一致性。

innodb现在已经是主流的存储引擎了,你可以大胆的进行这些操作。但是你应该有外键的这种思想,不能随便更新主表。

到此位置外键有关的操作就讲完了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个用 Python 连接 MySQL 数据库,并实现上述功能的代码示例: ```python import json import pymysql # 连接 MySQL 数据库 conn = pymysql.connect(host='192.168.0.126', user='root', password='quc@2022@din', database='py') # 定义查询物流轨迹的函数 def query_logistics_trajectory(tracking_number): # TODO: 调用快递查询 API 并返回结果 result = {'status': '0', 'msg': 'ok', 'result': {'number': tracking_number, 'type': 'zto', 'list': [{'time': '2018-03-09 11:59:26', 'status': '【石家庄市】快件已在【长安三部】 签收,签收人: 本人,感谢使用中通快递,期待再次为您服务!'}], 'deliverystatus': '3'}} return result # 查询表 logistics_trajectory 中的所有 tracking_number with conn.cursor() as cursor: sql = 'SELECT tracking_number FROM logistics_trajectory' cursor.execute(sql) results = cursor.fetchall() # 遍历 tracking_number 并更新表 logistics_trajectory with conn.cursor() as cursor: for result in results: tracking_number = result[0] # 调用 query_logistics_trajectory 函数查询物流轨迹 logistics_trajectory = query_logistics_trajectory(tracking_number) # 将 list 转换为 JSON 字符串 logistics_trajectory_json = json.dumps(logistics_trajectory['result']['list']) # 更新表 logistics_trajectory 中的 logistics_trajectory 字段 sql = f"UPDATE logistics_trajectory SET logistics_trajectory='{logistics_trajectory_json}' WHERE tracking_number='{tracking_number}' AND state='1'" cursor.execute(sql) # 提交事务 conn.commit() # 关闭数据库连接 conn.close() ``` 需要注意的是,上述代码中的 `query_logistics_trajectory` 函数只是一个示例,需要根据具体的快递查询 API 进行实现。另外,由于涉及到更新数据库,建议在执行前先备份数据以防止误操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值