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 | |
+-------+-------------+------+-----+---------+----------------+
有人能就这方面给我解决方案吗?
感谢。
答案 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
上添加唯一约束,因为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);
这是一个完整的演示
答案 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
尚未具有该值。当然,如果您想更改哪个字段定义了这个“唯一性”,您可以相应地修改SELECT
和LEFT JOIN
。