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

时间:2012-12-25 05:55:04

标签: mysql sql insert mysqli

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 |
    +-----+---------+------+------+------+

这是我的桌子。我想消除阻止插入重复记录,因为eno字段为auto increment总行永远不会重复,但记录是重复。 How can I prevent inserting those duplicate records

我尝试使用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    |                |
+-------+-------------+------+-----+---------+----------------+

有人能就这方面给我解决方案吗?

感谢。

3 个答案:

答案 0 :(得分:18)

通过添加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上添加唯一约束,因为enoAUTO_INCREMENT而始终是唯一的。

为了添加唯一约束,您需要在桌面上进行一些清理。

以下查询会删除一些重复记录,并通过在列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);

这是一个完整的演示

答案 1 :(得分:5)

创建一个您认为存在重复项的UNIQUE CONSTRAINT

喜欢

ALTER TABLE MYTABLE ADD CONSTRAINT constraint1 UNIQUE(column1, column2, column3)

答案 2 :(得分:1)

无论您是先清理表格(即可以立即停止插入重复项目并按照不同的时间表清理),这都可以正常工作,而无需以任何其他方式添加任何唯一约束或更改表格:

INSERT INTO
    emp (ename, dno, mgr, sal)
SELECT
    e.ename, 2, 2, 2000
FROM
    (SELECT 'dlksdgj' AS ename) e
    LEFT JOIN emp ON e.ename = emp.ename
WHERE
    emp.ename IS NULL

上述查询假设您希望将ename用作“唯一”字段,但同样地,您可以将此任何其他字段或其组合定义为此INSERT的唯一目标。

它有效,因为它是INSERT ... SELECT格式,SELECT部分只生成一行(即要插入的内容),如果它的左连接emp尚未具有该值。当然,如果您想更改哪个字段定义了这个“唯一性”,您可以相应地修改SELECTLEFT JOIN