work mysql 清除关联表数据

问题提出

有两个表主从关联,如果删除了主表数据,同时也要删除从表数据相对应的数据。

比如有两个表,一个是 member 用户表,一个是 delivery 骑手表,骑手也是用户。
他们通过 member_id 关联。

1. 建表:

CREATE TABLE `es_member` (
  `member_id` varchar(64) NOT NULL COMMENT '会员ID',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`member_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `es_delivery` (
  `member_id` varchar(64) NOT NULL COMMENT '会员id',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '操作时间',
  PRIMARY KEY (`member_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

2. 数据自己随便加几条

3. 思路: 找出他们现在存在关联关系的数据的 member_id 的集合, 然后删除不在这个集合中的

DELETE FROM `es_delivery` WHERE member_id NOT IN (SELECT d.member_id FROM es_member m INNER JOIN es_delivery d ON m.member_id = d.member_id);

4. 报错:

You can't specify target table 'es_delivery' for update in FROM clause

原因:不能在同一个sql语句中,先select同一个表的某些值,然后再update这个表。

5. 解决思路:如果不能再一个表中同时查询并更新,那就建立个中间表。

修改:

DELETE FROM `es_delivery` WHERE member_id NOT IN (SELECT m_id FROM(SELECT m.member_id m_id FROM es_member m INNER JOIN es_delivery d ON m.member_id = d.member_id) AS temp);

分解:

  1. 先 select 出 有关联的数据
SELECT m.member_id m_id FROM es_member m INNER JOIN es_delivery d ON m.member_id = d.member_id
  1. 创建一个中间表存放 member_id
SELECT m_id FROM(SELECT m.member_id m_id FROM es_member m INNER JOIN es_delivery d ON m.member_id = d.member_id) AS temp
  1. 最后删除已经没有关联的数据
DELETE FROM `es_delivery` WHERE member_id NOT IN ();
好的,您可以按照以下步骤将MySQL数据kaoqin的数据加载到Oracle数据EMP_WORK中: 1. 在Oracle数据库中创建EMP_WORK:在Oracle中使用CREATE TABLE语句创建一个名为EMP_WORK数据,包含kaoqin中的所有列和相应的数据类型。 2. 使用MySQL的SELECT INTO OUTFILE命令将kaoqin导出为CSV文件:使用SELECT INTO OUTFILE命令将kaoqin中的数据导出为CSV文件。这个命令可以将MySQL中的数据导出为一个文本文件。 3. 将CSV文件上传到Oracle服务器上:将导出的CSV文件上传到Oracle服务器上,例如使用FTP或SCP等工具上传到服务器的指定目录中。 4. 使用Oracle的SQL*Loader工具将CSV文件加载到EMP_WORK中:使用Oracle的SQL*Loader工具将上传的CSV文件加载到EMP_WORK中。这个工具可以将一个文本文件中的数据导入到Oracle中。 5. 确认数据已经成功插入到EMP_WORK中:使用SELECT语句检查EMP_WORK中是否已经成功插入数据。 具体的实现细节可以参考以下代码: 1. 创建EMP_WORK ```sql CREATE TABLE EMP_WORK ( id INT PRIMARY KEY, name VARCHAR2(50) NOT NULL, date DATE NOT NULL, time TIMESTAMP(0) NOT NULL, status VARCHAR2(10) NOT NULL ); ``` 2. 使用SELECT INTO OUTFILE命令将kaoqin导出为CSV文件 ```sql SELECT * INTO OUTFILE '/path/to/kaoqin.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM kaoqin; ``` 3. 将CSV文件上传到Oracle服务器上 可以使用FTP或SCP等工具将kaoqin.csv文件上传到Oracle服务器上的指定目录中。 4. 使用SQL*Loader工具将CSV文件加载到EMP_WORK中 创建一个名为emp_work.ctl的控制文件,内容如下: ``` LOAD DATA INFILE '/path/to/kaoqin.csv' INTO TABLE EMP_WORK FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS ( id, name, date "YYYY-MM-DD", time TIMESTAMP 'YYYY-MM-DD HH24:MI:SS', status ) ``` 然后使用以下命令运行SQL*Loader工具加载数据: ```bash sqlldr username/password control=/path/to/emp_work.ctl ``` 5. 确认数据已经成功插入到EMP_WORK中 使用SELECT语句检查EMP_WORK中是否已经成功插入数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值