2012-12-25 10 views
10
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 | 
    +-----+---------+------+------+------+ 

Oto mój stół. Chcę, aby wyeliminować lub zapobiec wstawiania duplikatów rekordów, ponieważ jest auto increment cały wiersz nigdy nie być duplikatem, ale rekordy są duplikaty. How can I prevent inserting those duplicate records,Jak zapobiec Duplikowaniu rekordów z mojej tabeli Wstaw ignorowanie nie działa tutaj

Próbowałem za pomocą INSERT IGNORE AND ON DUPLICATE KEY UPDATE (Chyba nie korzystali z nich prawidłowo).

Sposób użyłem ich jest,

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

Czy ktoś może mi dać rozwiązanie w tej kwestii?

Dzięki.

+0

Czy możesz opublikować wynik tego zapytania 'Pracownik DESC'? –

+0

jakie kolumny mają być unikalne? –

+0

Czy ktoś może mi podać inne, bardziej zoptymalizowane zapytanie na ten temat? – Chella

Odpowiedz

15

zmienić tabelę dodając UNIQUE ograniczenie

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

ale można to zrobić, jeśli tabela employee jest pusty.

czy istniały zapisy, spróbuj dodać IGNORE

ALTER IGNORE TABLE employee ADD CONSTRAINT emp_unique UNIQUE (ename,dno,mgr,sal) 

UPDATE 1

Coś poszło nie tak, tak sądzę. Wystarczy dodać wyjątkowe ograniczenie w kolumnie ename, ponieważ eno będzie zawsze unikatowe ze względu na AUTO_INCREMENT.

Aby dodać unikalne ograniczenie, należy wykonać pewne czyszczenie na stole.

Poniższe zapytania usuwają niektóre zduplikowane rekordy i zmieniają tabelę, dodając wyjątkowe ograniczenie w kolumnie 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); 

Oto pełnej demonstracji

+0

jest jakiś inny sposób ... niż użycie tego wyjątkowego ograniczenia klucza, ponieważ nie mam uprawnień do zmiany struktury tabeli ... nie mogę tego wyeliminować przed wstawieniem się bez użycia unikalnego – Chella

+0

uhmm, * myślę, że *, ** none **, ponieważ nie masz uprawnień do zmiany tabeli. jedynym sposobem, aby to zrobić, jest sprawdzenie go względem tabeli w celu wykrycia istnienia. –

+0

tak dokładnie, jak mogłem to zrobić ..? – Chella

4

Tworzenie UNIQUE CONSTRAINT na którym zdaniem duplicacy istnieje.

jak

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

to będzie działać niezależnie od tego, czy oczyścić tabelę pierwszy (czyli można natychmiast przerwać wstawianie duplikaty i oczyścić na osobnym harmonogramem) i bez konieczności dodawania żadnych unikalnych ograniczeń lub tabelę zmiany w inny sposób:

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 

powyższe zapytanie zakłada chcesz użyć ename jako „unikalne” pola, ale w ten sam sposób można zdefiniować żadnych innych pól lub ich kombinacji jako unikalne dla celów niniejszej INSERT.

Działa, ponieważ jest to format INSERT ... SELECT, w którym część SELECT tworzy tylko wiersz (tzn. Coś do wstawienia), jeśli jego lewy połączony emp nie ma już tej wartości. Naturalnie, jeśli chcesz zmienić, które pola zdefiniowały tę "unikalność", odpowiednio zmodyfikowałbyś SELECT i LEFT JOIN.

Powiązane problemy