2015-03-28 20 views
8
CREATE TABLE Permission ( 
    permissionID INTEGER PRIMARY KEY UNIQUE, 
    user   INTEGER 
    location  INTEGER 
); 

io non voglio avere utente o la località per essere UNIQUE perché posso avere più righe con l'utente che contengono gli stessi dati, o più righe con posizione contenente gli stessi dati. Voglio solo evitare che l'utente e la posizione abbiano un certo valore, con quella riga che si ripete un numero qualsiasi di volte.SQLite: Prevenire le righe duplicate

Es: questo è bene

permissionID user location 
-------------------------- 
     1  1  2 
     2  2  2 
     3  2  1 

ma questo non va bene:

permissionID user location 
-------------------------- 
     1  1  2 
     2  1  2 

quanto una riga esiste già in cui l'utente = 1 e la posizione = 2.

Come può Evito i duplicati?

risposta

14

dichiarare un unico vincolo su (utente, posizione).

CREATE TABLE Permission (
    permissionID integer primary key, 
    user integer not null, 
    location integer not null, 
    unique (user, location) 
); 
 
sqlite> insert into Permission (user, location) values (1, 2); 
sqlite> insert into Permission (user, location) values (1, 2); 
Error: UNIQUE constraint failed: Permission.user, Permission.location 
2

La prima opzione è la creazione di unique constraint su user e location colonne che eviteranno duplicati.

Create unique index permission_user_location on permission (user,location); 

Altrimenti se si dispone già di righe duplicate nella tabella è necessario eliminare le righe duplicate e creare unique constraint

Per rimuovere le righe duplicate utilizzare questa query

DELETE 
FROM Permission 
WHERE NOT EXISTS 
(
select 1 from 
(
select min(permissionID) as permissionID, user, location 
From Permission A 
Group by user, location 
) B 
Where B.permissionID = Permission.permissionID 
AND B.user = Permission.User 
AND B.location = Permission.location 
) 
1
CREATE TABLE Permission ( 
    permissionID INTEGER PRIMARY KEY UNIQUE, 
    user   INTEGER, 
    location  INTEGER 
); 
CREATE UNIQUE INDEX user_location ON Permission (user,location); 
Problemi correlati