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

これが私のテーブルです。フィールドは合計行が重複することはありませんが、レコードが重複しているため、重複レコードの挿入を排除または防止したいと思います。これらの重複レコードの挿入を防ぐにはどうすればよいですか?enoauto increment

使ってみました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    |                |
+-------+-------------+------+-----+---------+----------------+
4

3 に答える 3

22

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);

これが完全なデモンストレーションです

于 2012-12-25T05:57:21.873 に答える
7

UNIQUE CONSTRAINT重複が存在すると思われるを作成します。

お気に入り

ALTER TABLE MYTABLE ADD CONSTRAINT constraint1 UNIQUE(column1, column2, column3)
于 2012-12-25T05:57:46.737 に答える
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形式であるために機能します。当然、この「一意性」を定義するフィールドを変更したい場合は、それに応じてとを変更します。SELECTempSELECTLEFT JOIN

于 2016-07-30T10:17:41.953 に答える