mysql - 如何防止表中的重复记录插入忽略在这里不起作用

标签 mysql sql insert

mysql> select * from emp;

    +-----+---------+------+------+------+
    | eno | ename   | dno  | mgr  | sal  |
    +-----+---------+------+------+------+
    |   1 | rama    |    1 | NULL | 2000 |
    |   2 | kri     |    1 |    1 | 3000 |
    |   4 | kri     |    1 |    2 | 3000 |
    |   5 | bu      |    1 |    2 | 2000 |
    |   6 | bu      |    1 |    1 | 2500 |
    |   7 | raa     |    2 | NULL | 2500 |
    |   8 | rrr     |    2 |    7 | 2500 |
    |   9 | sita    |    2 |    7 | 1500 |
    |  10 | dlksdgj |    2 |    2 | 2000 |
    |  11 | dlksdgj |    2 |    2 | 2000 |
    |  12 | dlksdgj |    2 |    2 | 2000 |
    |  13 | dlksdgj |    2 |    2 | 2000 |
    |  14 | dlksdgj |    2 |    2 | 2000 |
    +-----+---------+------+------+------+

这是我的 table 。我想消除防止插入重复记录,因为eno字段是自动增量总行从不是重复的,但记录是重复的。如何防止插入这些重复记录?

我尝试使用INSERT IGNORE AND ON DUPLICATE KEY UPDATE(我认为我没有正确使用它们)。

我使用它们的方式是,

mysql> insert into emp(ename,dno,mgr,sal) values('dlksdgj',2,2,2000);
Query OK, 1 row affected (0.03 sec)

mysql> insert ignore into emp(ename,dno,mgr,sal) values('dlksdgj',2,2,2000);
Query OK, 1 row affected (0.03 sec)

mysql> insert into emp(ename,dno,mgr,sal) values('dlksdgj',2,2,2000) ON DUPLICATE KEY UPDATE eno=eno;
Query OK, 1 row affected (0.03 sec)
mysql> insert into emp(ename,dno,mgr,sal) values('dlksdgj',2,2,2000) ON DUPLICATE KEY UPDATE eno=eno;
Query OK, 1 row affected (0.04 sec

mysql> desc emp;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| eno   | int(11)     | NO   | PRI | NULL    | auto_increment |
| ename | varchar(50) | YES  |     | NULL    |                |
| dno   | int(11)     | YES  |     | NULL    |                |
| mgr   | int(11)     | YES  | MUL | NULL    |                |
| sal   | int(11)     | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

最佳答案

通过添加UNIQUE约束来更改表

ALTER TABLE employee ADD CONSTRAINT emp_unique UNIQUE (ename,dno,mgr,sal)

但如果表 employee 为空,您可以执行此操作。

或者如果记录存在,请尝试添加IGNORE

ALTER IGNORE TABLE employee ADD CONSTRAINT emp_unique UNIQUE (ename,dno,mgr,sal)

更新1

我猜出了什么问题。您只需在 ename 列上添加唯一约束,因为由于 AUTO_INCRMENTeno 将始终是唯一的。

为了添加唯一约束,您需要对表进行一些清理。

下面的查询删除了一些重复记录,并通过在ename列上添加唯一约束来更改表。

DELETE a
FROM Employee a
     LEFT JOIN
     (
        SELECT ename, MIN(eno) minEno
        FROM Employee
        GROUP BY ename
     ) b ON a.eno = b.minEno
WHERE b.minEno IS NULL;

ALTER TABLE employee ADD CONSTRAINT emp_unique UNIQUE (ename);

这是完整的演示

关于mysql - 如何防止表中的重复记录插入忽略在这里不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48556047/

相关文章:

mysql - 在mysql存储过程中使用concat创建json

mysql - MySQL 数据库损坏,只能通过 innodb_force_recovery=6 进行访问

mysql - SQL 选择所有不一起工作的 ID 号对

PHP&MYSQL - 向数据库插入数据失败

mysql - 添加一个新的 MySQL Col,其行依赖于其他行

php - 查询未执行

php - PHP检查用户名是否存在

postgresql - 对插入语句进行故障排除,失败但没有错误

mysql - 这可以在一个查询中完成吗?

sql - 无法将 Tuple 类与 native 查询一起使用