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

Mysql 如何防止“我的表插入忽略”中的重复记录在这里不起作用,mysql,sql,insert,Mysql,Sql,Insert,这是我的桌子。我想消除或防止重复记录的插入,因为eno字段是auto incrementtotal行永远不会重复,但记录是重复的。如何防止插入那些重复记录 我尝试使用插入忽略和重复密钥更新(我想我没有正确使用它们) 我使用它们的方式是 mysql> select * from emp; +-----+---------+------+------+------+ | eno | ename | dno | mgr | sal | +-----+-----

这是我的桌子。我想消除或防止重复记录的插入,因为
eno
字段是
auto increment
total行永远不会重复,但记录是重复的。如何防止插入那些重复记录

我尝试使用
插入忽略和重复密钥更新
(我想我没有正确使用它们)

我使用它们的方式是

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

通过添加
UNIQUE
约束来更改表

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    |                |
+-------+-------------+------+-----+---------+----------------+
但是,如果表
employee
为空,则可以执行此操作

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

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

我想是出了点问题。您只需要在列
ename
上添加唯一约束,因为
eno
由于
AUTO\u INCREMENT
而始终是唯一的

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

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

ALTER IGNORE TABLE employee ADD CONSTRAINT emp_unique UNIQUE (ename,dno,mgr,sal)
这是一个完整的演示


创建一个您认为存在双重性的
唯一约束


无论您是否首先清理表(即,您可以立即停止插入重复项并按单独的计划进行清理),并且无需添加任何唯一约束或以任何其他方式更改表,这都将起作用:

ALTER TABLE MYTABLE ADD CONSTRAINT constraint1 UNIQUE(column1, column2, column3)
上面的查询假设您希望将
ename
用作“唯一”字段,但同样,您也可以将任何其他字段或它们的组合定义为唯一,以便执行此
INSERT


它之所以有效是因为它是一个
插入。。。如果左连接的
emp
没有该值,则选择
SELECT
部件仅生成一行(即要插入的内容)的格式。当然,如果您想更改定义此“唯一性”的字段,您需要相应地修改
选择和
左连接。

您能发布此查询的结果吗
DESC Employee
?列是什么你想让值是唯一的吗?有人能给我任何其他更优化的查询吗..有没有其他方法…除了使用这个唯一的键约束,因为我没有权限更改表结构…我想,我不能在插入之前消除它,而不使用uniqueuhmm,没有,因为你没有更改桌子的特权。唯一的方法是对照表检查记录是否存在。您可以先执行此查询来检查记录
从emp中选择COUNT(*)totalCount,其中ename='nameHere'
,如果结果大于或等于1,则该值存在。
ALTER TABLE MYTABLE ADD CONSTRAINT constraint1 UNIQUE(column1, column2, column3)
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