Как предотвратить дублирование записей из моей таблицы Вставка ignore не работает здесь

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

Может ли кто-нибудь дать мне решение в этом отношении?

Спасибо.

Ответ 1

измените таблицу, добавив 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, так как eno всегда будет уникальным из-за AUTO_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);

Здесь полная демонстрация

Ответ 2

Создайте UNIQUE CONSTRAINT, на котором, по вашему мнению, существует дубликат.

like

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

Ответ 3

Это будет работать независимо от того, очистите ли вы первую таблицу (т.е. вы сразу можете прекратить вставлять дубликаты и очищать в отдельном расписании) и без необходимости добавлять какие-либо уникальные ограничения или изменять таблицу любым другим способом:

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 еще не имеет этого значения. Естественно, если бы вы захотели изменить, какое поле определили эту "уникальность", вы соответственно измените SELECT и LEFT JOIN.