MySQL —— 删除emp_no重复的记录,只保留最小的id对应的记录

题目:删除emp_no重复的记录,只保留最小的id对应的记录

CREATE TABLE IF NOT EXISTS titles_test (
id int(11) not null primary key,
emp_no int(11) NOT NULL,
title varchar(50) NOT NULL,
from_date date NOT NULL,
to_date date DEFAULT NULL);

insert into titles_test values ('1', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('2', '10002', 'Staff', '1996-08-03', '9999-01-01'),
('3', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('4', '10004', 'Senior Engineer', '1995-12-03', '9999-01-01'),
('5', '10001', 'Senior Engineer', '1986-06-26', '9999-01-01'),
('6', '10002', 'Staff', '1996-08-03', '9999-01-01'),

('7', '10003', 'Senior Engineer', '1995-12-03', '9999-01-01');

删除后titles_test表为

idemp_notitlefrom_dateto_date
110001Senior Engineer1986-06-269999-01-01
210002Staff1996-08-039999-01-01
310003Senior Engineer1995-12-039999-01-01
410004Senior Engineer1995-12-039999-01-01

常规思路:先根据员工工号分组,把每一组的最小id查出来(min),然后直接删除id不在最小id里面的数据行即可(not in)。

自己操作:直接两步,子查询后接上删除语句(这里有个坑)

坑:MySQL中不允许在子查询的同时删除表数据(不能查出就连着删除语句删)(不可以父子操作),要把先操作的表进行重命名。但是查询操作是可以一个连着一个查询的(父子操作)。

delete from titles_test where id not in
(select mid from 
  (select min(id) mid from titles_test group by emp_no) m
);

中间有个间接的过程!!!

### 数据库表结构及外键关联说明 数据库中的表结构设计是一个关键环节,尤其是在多表环境中,通过外键可以实现不同表之间的数据关联。以下是关于表结构及其外键约束关系的具体说明。 #### 表结构概述 在数据库中,表是由行和列组成的二维结构。每一列表示一个属性(字段),而每行表示一条记录。为了确保数据的一致性和完整性,在设计表时通常会引入主键和外键的概念。 - **主键**:用于唯一标识表中的每一行记录。它可以由单个字段或多个字段组合而成。 - **外键**:定义了一个表中的字段与另一个表中的字段之间的关联关系[^1]。 #### 外键的作用 外键的主要作用在于维护参照完整性。当两个表存在某种逻辑上的联系时,可以通过在外键上设置相应的规则来控制这种联系的行为。例如: - 防止非法的数据被插入到某个表中; - 当删除或更新父表中的数据时,自动同步子表的相关操作。 #### MySQL中外键的创建语法 MySQL支持标准SQL语句用来声明外键。其基本格式如下所示: ```sql [CONSTRAINT 符号名] FOREIGN KEY (从表字段) REFERENCES 主表(主表字段); ``` 具体例子可参见以下代码片段[^2]: ```sql CREATE TABLE department ( dept_id INT PRIMARY KEY, dept_name VARCHAR(50) ); CREATE TABLE employee ( emp_id INT PRIMARY KEY, emp_name VARCHAR(50), dept_id INT, CONSTRAINT FK_dept_emp FOREIGN KEY(dept_id) REFERENCES department(dept_id) ); ``` 上述脚本建立了`department`和`employee`两张表格,并设置了`employee.dept_id`作为指向`department.dept_id`的一个外键。 #### Oracle中的联合外键情况 对于更复杂的情况比如涉及联合主键的情形下,则需要特别注意的是如果目标表中有复合主键的话,源表也需要相应地建立同样数量并匹配类型的字段形成所谓的“联合外键”。这意味着如果你有一个包含两列或多列构成的主键存在于某张表里头,那么任何试图引用它的其他表也得提供相同数目且顺序一致的对应列来进行绑定[^3]。 假设我们有这样一种场景——订单详情(`order_details`)依赖于产品类别(`product_categories`)加上实际商品本身的信息(`products`)共同决定唯一的条目编号;此时就可以像下面这样做: ```sql -- 创建 product_categories 表 CREATE TABLE product_categories( category_code CHAR(3) NOT NULL, description NVARCHAR2(100), CONSTRAINT pk_product_category PRIMARY KEY(category_code) ); -- 创建 products 表 CREATE TABLE products( prod_num NUMBER(8) NOT NULL, category_code CHAR(3) NOT NULL, name NVARCHAR2(100), price DECIMAL(7,2), CONSTRAINT fk_prod_cat FOREIGN KEY(category_code) REFERENCES product_categories(category_code), CONSTRAINT pk_products PRIMARY KEY(prod_num,category_code) ); -- 创建 order_details 表 CREATE TABLE order_details( ordernum NUMBER(9) NOT NULL, lineitemnum SMALLINT NOT NULL, prod_num NUMBER(8) NOT NULL, category_code CHAR(3) NOT NULL, quantity INTEGER DEFAULT 1 CHECK(quantity >=1 AND quantity <=999), unitprice DECIMAL(7,2), CONSTRAINT fk_order_detail FOREIGN KEY(prod_num,category_code) REFERENCES products(prod_num,category_code), CONSTRAINT pk_order_details PRIMARY KEY(ordernum,lineitemnum) ); ``` 这里展示了如何在一个更加复杂的商业应用模型当中运用到了联合主键以及对应的联合外键机制。 ### 结论 综上所述,无论是简单的单一字段还是较为复杂的多字段间的关系都可以借助外键这一工具有效地加以管理从而保障整个系统的稳定运行状态。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知笑长长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值