mysql: valores unicos
supongamos que tengo la siguiente tabla en mysql:
<code>
columnaA|columnaB
1 | 2
1 | 3
5 | 2
</code>
como veis hay columnas con valores repetidos, pero me gustaria saber si se puede hacer que en caso de que los valores insertados ya existen en otra fila no se puede insertar (como si fuesen UNIQUE pero por grupos)
es decir, si se pretende insertar de nuevo columnaA=5 y columnaB=2 no se deje, pero si fuese por ejemplo columnaA=5 y columnaB=1 si.
lo que se me habia ocurrido era hacer una tercera columna, que contuviese toda la fila concatenada, en plan 1.2, 1.3, 5.2 etc, y que ese si campo si fuera de tipo UNIQUE, pero sabeis si se puede hacer por sql directamente?
muchas gracias!
juandelgado
Lo que no sé es si se puede hacer con una sola consulta, pero yo creo que se puede hacer así:
1 - Haces una consulta buscando los valores en grupo.
2 - Si esa consulta et devuelve 0 columnas, es que tienes via libre, en caso contrario no.
Te lo pongo en PHP de andar por casa
<code>$query = "SELECT * FROM tabla WHERE campo1 = '1' AND campo2 = '2'";
$query_db = mysql_query($query);
if(mysql_num_rows($query_db)>0){ // ya estan los registros
// acciones de que no
} else { // estan los registros libres
// acciones de que si, en tu caso hacer la inserción "real"
}</code>
Si no utilizas PHP por lo menos espero que te ayude la idea. De todas formas igual se puede hacer con una sola consulta.
Suerte!
mik
Del manual de mysql: http://dev.mysql.com/doc/mysql/en/CREATE_TABLE.html
A PRIMARY KEY can be a multiple-column index. However, you cannot create a multiple-column index using the PRIMARY KEY key attribute in a column specification. Doing so will mark only that single column as primary. You must use a separate PRIMARY KEY(index_col_name, ...) clause.
Es decir, podemos crear una tabla con una clave primaria de varias columnas. La clave primaria (o indice unique) es aquel conjunto de columnas que puden identificar univocamente a cada una de las filas de la tabla, es decir, en cada fila debe tener un valor distinto. La clave primaria es necesaria pues si no no podriamos distinguir las filas. De hecho, si no declaramos explicitamente un primary key, el gestor te declara implicitamente una consistente en todas las columnas de la tabla. En tu ejemplo, si esas son las únicas dos columnas no podrás insertar una fila duplicada ya que estarías violando la clave primaria de la tabla. Si hay más columnas pero sólo quieres que el sistema se "queje" cuando duplicas las dos primeras columnas pudes declararte explicitamente una clave primaria consistente en esas columnas:
<code>CREATE TABLE mitabla (
col1 INT NOT NULL,
col2 INT NOT NULL,
col3 INT,
PRIMARY KEY(col1,col2)
);</code>
lo de NOT NULL es pq en las claves primarias, las versiones antiguas de mysql se quejan si no lo pones, las nuevas te dejan quitarlo.
suerte con las claves primarias!ya me contaras...
dagi3d
estupendo! lo acabo de probar y funcion perfectamente :)
muchas gracias a los dos