Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

MySQL

Estas en el tema de MySQL en el foro de Bases de Datos General en Foros del Web. Hola Amig@s! Cómo puedo hacer para que mi tabla no permita la repetición de datos? Los campos de mi tabla son los siguientes: ID, Nombre, ...
  #1 (permalink)  
Antiguo 27/04/2004, 11:27
 
Fecha de Ingreso: febrero-2004
Ubicación: Brasil
Mensajes: 39
Antigüedad: 20 años, 9 meses
Puntos: 0
Exclamación MySQL

Hola Amig@s!
Cómo puedo hacer para que mi tabla no permita la repetición de datos?
Los campos de mi tabla son los siguientes:
ID, Nombre, Apellido, Ciudad, País, Edad, Email.

Por ejemplo, si alguien llena el formulario con estos datos:
Nombre: Juan
Apellido: Perez
Ciudad: City
País: Terralandia
Edad: 99
Email: [email protected]

Nadie más debería poder ingresar los mismos datos en los siguientes campos: Nombre, Apellido, País, Email. Sólo debería aceptar si por lo menos uno de esos cuatro campos fuera diferente. Por ejemplo, sería válido si aparece otro:
Nombre: Juan
Apellido: Perez
Ciudad: Pueblo
País: Disneylandia
Edad: 99
Email: [email protected]

Antes de enviar este mensaje, leí el manual de MySQL y las FAQ de este foro pero no encontré nada que me ayude a entender la solución. Hace pocas semanas empecé a aprender PHP y MySQL, así que por favor disculpen mi ignorancia.
Imaginé que la respuesta estaría en los Índices o Index, pero si es así no entiendo como usar. Los campos que no deben permitir la repetición de datos serían ID, Nombre, Apellido, Email y País.

Muchas gracias!

Luis
__________________
LuisTV
[email protected]
  #2 (permalink)  
Antiguo 27/04/2004, 11:38
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 23 años
Puntos: 655
En parte te estas respondiendo... una llave primariaque es el ID el cual creo que es autoincrement y una llave foranea o secundaria que sea la concatenación de los campos que no queres se repita.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #3 (permalink)  
Antiguo 27/04/2004, 11:43
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 21 años, 1 mes
Puntos: 11
establece como primary key todos esos campos.

create table nombre_tabla
(
Nombre varchar(30) not null,
Apellido varchar(30) not null,
Ciudad varchar(30) not null,
País varchar(30) not null,
Edad int not null,
Email varchar(30) not null,
primary key(Nombre, Apellido, Ciudad, País,Email)
)
__________________
Dedicado a proyectos web, actualmente desarrollando un sistema de diseño de flyers online muy fácil de usar.
  #4 (permalink)  
Antiguo 27/04/2004, 11:47
 
Fecha de Ingreso: febrero-2004
Ubicación: Brasil
Mensajes: 39
Antigüedad: 20 años, 9 meses
Puntos: 0
Brujo, como dije, yo imaginaba q podría ser eso, pero no sabía q hacer... ahora gracias Claudio creo q podré resolverlo...
Gracias a ambos... voy a intentar y después les aviso, ok?
Luis
__________________
LuisTV
[email protected]
  #5 (permalink)  
Antiguo 27/04/2004, 11:51
Avatar de jarabas
Usuario no validado
 
Fecha de Ingreso: abril-2004
Mensajes: 111
Antigüedad: 20 años, 7 meses
Puntos: 0
Desconozco la solucion a tu pregunta pero
La solucion propuesta por claudiovega(sin animo de ofender) no te va ha hacer lo que tu querias que te hiciera ya que al ser todas primarias no vas a poder repetir ninguna de ellas.
  #6 (permalink)  
Antiguo 27/04/2004, 11:59
 
Fecha de Ingreso: febrero-2004
Ubicación: Brasil
Mensajes: 39
Antigüedad: 20 años, 9 meses
Puntos: 0
Jarabas, acabo de intentar hacer lo q me dijo Claudio, pero mysql no me deja tener más de un "primary"...´un amigo me dijo q sería mejor hacer una consulta para ver si existen los datos antes de enviar los nuevos... y me dijo también q era muy simple pero no tenía tiempo para ayudarme ahora... :(
Por favor, ayúdenme!
Gracias!
__________________
LuisTV
[email protected]

Última edición por luistv; 27/04/2004 a las 12:06
  #7 (permalink)  
Antiguo 27/04/2004, 12:15
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 21 años, 1 mes
Puntos: 11
la consulta sería mas menos asi:

select count(*) from tabla where nombre='varnombre' and apellido='varapellido' and
ciudad= 'varciudad' ....
__________________
Dedicado a proyectos web, actualmente desarrollando un sistema de diseño de flyers online muy fácil de usar.
  #8 (permalink)  
Antiguo 27/04/2004, 12:39
 
Fecha de Ingreso: febrero-2004
Ubicación: Brasil
Mensajes: 39
Antigüedad: 20 años, 9 meses
Puntos: 0
ok Claudio, gracias nuevamente, intentaré y luego te aviso ;)

Luis
__________________
LuisTV
[email protected]
  #9 (permalink)  
Antiguo 27/04/2004, 13:06
 
Fecha de Ingreso: febrero-2004
Ubicación: Brasil
Mensajes: 39
Antigüedad: 20 años, 9 meses
Puntos: 0
Claudio, antes probar, por favor podrías explicarme, qué es lo que hace esa consulta?
__________________
LuisTV
[email protected]
  #10 (permalink)  
Antiguo 27/04/2004, 13:11
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 21 años, 1 mes
Puntos: 11
cuenta los registros que contengan todos los valores que se introdujeron en el formulario , por lo tanto, si el conteo es mayor que cero entonces quiere decir que existe un registro con esos valores.

select count(*) as cuenta from tabla where nombre='varnombre' and apellido='varapellido' and
ciudad= 'varciudad'

el valor total de registros que coinciden se devuelve en cuenta. en la clausula where debes colocar sólo lo campos que no se deben repetir, no todos.
__________________
Dedicado a proyectos web, actualmente desarrollando un sistema de diseño de flyers online muy fácil de usar.
  #11 (permalink)  
Antiguo 27/04/2004, 13:15
 
Fecha de Ingreso: febrero-2004
Ubicación: Brasil
Mensajes: 39
Antigüedad: 20 años, 9 meses
Puntos: 0
ok, voy a intentar Claudio ;)
gracias!
(Me han dicho que Puerto Montt es muy bonita, verdad?... conozco una canción muy romántica y antigua con ese nombre...)
__________________
LuisTV
[email protected]
  #12 (permalink)  
Antiguo 27/04/2004, 13:25
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 21 años, 1 mes
Puntos: 11
Si, es una ciudad muy bonita, fria y muy lluviosa casi todo el año eso si.
La cancion de los iracundos (uruguayos creo) es todo un himno por acá.
__________________
Dedicado a proyectos web, actualmente desarrollando un sistema de diseño de flyers online muy fácil de usar.
  #13 (permalink)  
Antiguo 27/04/2004, 13:48
 
Fecha de Ingreso: febrero-2004
Ubicación: Brasil
Mensajes: 39
Antigüedad: 20 años, 9 meses
Puntos: 0
Amigo Claudio, este es mi script y no sé dónde debería poner esa consulta q me pasaste, podrías ayudarme más un poco?

formulario.php
Código PHP:
<html>
<head>
<title></title>
</head>
<body>
<!-- creamos un formulario en el que recogeremos los valores
     a añadir a la base de datos jugadores
     utilizaremos los mismos nombres de variables que en aquel
     - por razones de comodidad- anteponiendoles p_ -->

<form name="altas" method=POST action="reg_jugadores.php">
<table bgcolor="#EEEEEE" align=center border=1>


<td align="right">Nombre : </td>
<td align="left"> <input type="text" name="p_v1" value="" size=20></td><tr>
<td align="right">Primer apellido : </td>
<td align="left"> <input type="text" name="p_v2" value="" size=15></td><tr>
<td align="right">Segundo apellido : </td>
<td align="left"> <input type="text" name="p_v3" value="" size=15></td><tr>
<td align="right">Seudónimo : </td>
<td align="left"> <input type="text" name="p_v4" value="" size=15></td><tr>
<td align="right">Fecha de nacimiento: </td>

<!-- para evitar fechas de nacimiento incorrectas
     utilizamos la opción select para asignarles valores
     y recogemos en un array de indices 0, 1 y 2
     los valores respectivos de año, mes y día
     con el ánimo de mantener la misma secuencia
     con la que MySQL registrará estos datos -->

<td align="left"> <select name="p_v5[2]">
<? for ($i=1;$i<32;$i++){
echo 
"<option>$i</option>";
}
?>
</select> de
<select name="p_v5[1]">
<? for ($i=1;$i<13;$i++){
echo 
"<option>$i</option>";
}
?>
</select> de
<select name="p_v5[0]">
<? for ($i=1901;$i<2001;$i++){
echo 
"<option>$i</option>";
}
?>
</td><tr>
<td align="right">Ciudad : </td>
<td align="left"> <input type="text" name="p_v6" value="" size=20></td><tr>
<td align="right">País : </td>
<td align="left"> <input type="text" name="p_v7" value="" size=20></td><tr>

<!-- la opción posición la activamos mediante un SELECT MULTIPLE
        que permite visualizar las OPCIONES DE posiciones
        POR EL MISMO ORDEN EN QUE FUERON DEFINIDAS
        EN LA OPCION SET DE LA BASE DE DATOS
        A cada una de las opciones les asignamos como valor
        una POTENCIA DE DOS empezando por
        2 elevado 0, 2 elevado 1, 2 elevado 2, etc.
    la finalidad de esta estrategia es permitir
        que en el formulario de ALTAS
        se puedan sumar estos valores y que esa suma
        se el valor decimal equivalente al valor binario
        de las opciones seleccionadas
        El array p_v9 recogerá con indices correlativos
        a partir de 0, unicamente los valores de
        AQUELLAS OPCIONES QUE HAN SIDO SELECCIONADAS -->

<td align="right">Posición:<br>
(<i>Si juega en varias posiciones,<br>
podemos seleccionarlas pulsando con<br>
el mouse encima de cada una de ellas<br>
con la tecla <b>Ctrl</b> presionada</i>)</td>
<td align="left"> <SELECT MULTIPLE name=p_v8[] SIZE=4>
<option  value=1>Arquero</option>
<option  value=2>Defensa</option>
<option value=4>Mediocampista</option>
<option  value=8>Delantero</option>
</select>
</td><tr>
<td align="right">Club actual : </td>
<td align="left"> <input type="text" name="p_v9" value="" size=20></td><tr>
<!--colocamos los botones de enviar y borrar -->


<td align=center><input type=submit value="Enviar"></td>
<td align=center><input type=reset value="Borrar"></td>
</table>
</body>
</html>
reg_jugadores.php
Código PHP:
<html>
<head>
<title>título</title>
</head>
<body>
<?
# recogemos en una variable el nombre de BASE DE DATOS
$base="db";

# recogemos en una variable el nombre de la TABLA
$tabla="tabla";

# recoger y adaptar las variables pasadas desde el formulario
$v1=$p_v1;
$v2=$p_v2;
$v3=$p_v3;
$v4=$p_v4;

# recogemos la cadena fecha en formato AAAA-MM-DD
# para ello encadenamos los valores recogidos del formulario
# año ($p_v5[0]) mes ($p_v5[1]) y día ($p_v5[2])
# incluyendo los separadores de fechas (-)
# y los recogemos en la variable $v5
$v5=$p_v5[0]."-".$p_v5[1]."-".$p_v5[2];

# el truco de asignar en el formulario valores 1,2,4,8,16,32 a las opciones de idioma
# nos permite sumarlos aquí para obtener el valor conjunto
# aqui se suman todos los valores de la matriz pasada desde el formulario
$v6=$p_v6;
$v7=$p_v7;
 {
$v8+=$valor;
};
$v9=$p_v9;

# establecemos la conexion con el servidor
$conexion=mysql_connect("localhost","root","contraseña");

#asiganamos la conexión a una base de datos determinada
mysql_select_db($base,$conexion);

# AÑADIMOS EL NUEVO REGISTRO
mysql_query("INSERT $tabla (Nombre,Apellido1,Apellido2,Nick,Nacimiento,Ciudad,Pais,Posicion,Club) VALUES ('$v1','$v2','$v3','$v4','$v5','$v6','$v7',$v8,'$v9')",$conexion);

#comprobamos el resultado de la insercion
# el error CERO significa NO ERROR
# el error 1062 significa Clave duplicada
# en otros errores forzamos a que nos ponga el número de error
# y el significado de ese error (aunque sea en ingles)....
if (mysql_errno($conexion)==0){echo "<h2>Registro Añadido</b></H2>";
echo 
$v1."<br>";
echo 
$v2."<br>";
echo 
$v3."<br>";
echo 
$v4."/".$mes."/".$ano."<br>";
echo 
$v5."<br>";
echo 
$v6."<br>";
echo 
$v7."<br>";
echo 
$v8."<br>";
echo 
$v9."<br>";
echo 
"<a href=consulta_jugadores.php><b>Vea todos los jugadores</b></a>";
             }else{
        if (
mysql_errno($conexion)==1062){echo "<h2>No ha podido añadirse el registro</h2>";
            }else{
            
$numerror=mysql_errno($conexion);
            
$descrerror=mysql_error($conexion);
            echo 
"Se ha producido un error nº $numerror que corresponde a: $descrerror  <br>";
        }

}

# cerramos la conexion

 
mysql_close();

?>
</body>
</html>
Y espero q les sirva a otros
__________________
LuisTV
[email protected]
  #14 (permalink)  
Antiguo 27/04/2004, 13:59
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 21 años, 1 mes
Puntos: 11
#asiganamos la conexión a una base de datos determinada

mysql_select_db($base,$conexion);

#aqui se agrega la consulta
$sql="consulta";
$result=mysql_query($sql);
if($result && mysql_num_rows($result)>0)
{
no se graba el registro porque existe
}
else
{
# AÑADIMOS EL NUEVO REGISTRO

mysql_query("INSERT $tabla (Nombre,Apellido1,Apellido2,Nick,Nacimiento,Ciudad
,Pais,Posicion,Club) VALUES ('$v1','$v2','$v3','$v4','$v5','$v6','$v7',$v8,'$v
9')",$conexion);

.....

}
__________________
Dedicado a proyectos web, actualmente desarrollando un sistema de diseño de flyers online muy fácil de usar.
  #15 (permalink)  
Antiguo 27/04/2004, 14:30
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 23 años
Puntos: 655
Mira, no podes crear varias llaves primarias (primary key) por eso te dio error al tratar de crear la segunda llave la cual te dije que deberia ser una llave foranea o secundaria. Esta se hace con el siguiente comando.

ALTER TABLE nombre_tabla ADD UNIQUE nombre_indice (nombre, apellido, ciudad)

Al estar creado ese índice y al tener el atributo de único, no va a permitir duplicar datos.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #16 (permalink)  
Antiguo 28/04/2004, 05:58
Avatar de jarabas
Usuario no validado
 
Fecha de Ingreso: abril-2004
Mensajes: 111
Antigüedad: 20 años, 7 meses
Puntos: 0
Si sigues queriendo poner todas como clave primaria (que ya has dicho que no te deja) pon UNIQUE en la definicion de las columnas, de este modo no te dejara introducir registros repetidos.

Un saludo.
  #17 (permalink)  
Antiguo 28/04/2004, 08:05
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 23 años
Puntos: 655
Eso no resolveria el problema jarabas porque hay apellidos, nombres, ciudades, paises, etc. que se repiten y poniendo esos campos como UNIQUE, solo se va a poder poner un valor para cada uno de ellos.

¿Qué pasaría si una familia se quisiera registrar? Solo podría hacerlo uno ya que no permitiría otro apellido igual.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #18 (permalink)  
Antiguo 28/04/2004, 08:17
Avatar de jarabas
Usuario no validado
 
Fecha de Ingreso: abril-2004
Mensajes: 111
Antigüedad: 20 años, 7 meses
Puntos: 0
Buena explicacion BrujoNic, lo he entendido a la primera

Un saludo.

Última edición por jarabas; 28/04/2004 a las 08:19
  #19 (permalink)  
Antiguo 28/04/2004, 09:13
 
Fecha de Ingreso: febrero-2004
Ubicación: Brasil
Mensajes: 39
Antigüedad: 20 años, 9 meses
Puntos: 0
Me da error en la línea que dice: no se graba el registro porque existe...
Código PHP:
<html>
<head>
<title>título</title>
</head>
<body>
<?
# recogemos en una variable el nombre de BASE DE DATOS
$base="db";

# recogemos en una variable el nombre de la TABLA
$tabla="tabla";

# recoger y adaptar las variables pasadas desde el formulario
$v1=$p_v1;
$v2=$p_v2;
$v3=$p_v3;
$v4=$p_v4;

# recogemos la cadena fecha en formato AAAA-MM-DD
# para ello encadenamos los valores recogidos del formulario
# año ($p_v5[0]) mes ($p_v5[1]) y día ($p_v5[2])
# incluyendo los separadores de fechas (-)
# y los recogemos en la variable $v5
$v5=$p_v5[0]."-".$p_v5[1]."-".$p_v5[2];

# el truco de asignar en el formulario valores 1,2,4,8,16,32 a las opciones de idioma
# nos permite sumarlos aquí para obtener el valor conjunto
# aqui se suman todos los valores de la matriz pasada desde el formulario
$v6=$p_v6;
$v7=$p_v7;
 {
$v8+=$valor;
};
$v9=$p_v9;

# establecemos la conexion con el servidor
$conexion=mysql_connect("localhost","root","contraseña");

#asignamos la conexión a una base de datos determinada

mysql_select_db($base,$conexion);

#aqui se agregó la consulta
$sql="consulta";
$result=mysql_query($sql);
if(
$result && mysql_num_rows($result)>0)
{
no se graba el registro porque existe... pero aparece error en esta línea
}
else
{
# AÑADIMOS EL NUEVO REGISTRO
mysql_query("INSERT $tabla  (Nombre,Apellido1,Apellido2,Nick,Nacimiento,Ciudad,Pais,Posicion,Club) VALUES  ('$v1','$v2','$v3','$v4','$v5','$v6','$v7',$v8,'$v9')",$conexion);

#comprobamos el resultado de la insercion
# el error CERO significa NO ERROR
# el error 1062 significa Clave duplicada
# en otros errores forzamos a que nos ponga el número de error
# y el significado de ese error (aunque sea en ingles)....
if (mysql_errno($conexion)==0){echo "<h2>Registro Añadido</b></H2>";
echo 
$v1."<br>";
echo 
$v2."<br>";
echo 
$v3."<br>";
echo 
$v4."/".$mes."/".$ano."<br>";
echo 
$v5."<br>";
echo 
$v6."<br>";
echo 
$v7."<br>";
echo 
$v8."<br>";
echo 
$v9."<br>";
echo 
"<a href=consulta_jugadores.php><b>Vea todos los jugadores</b></a>";
             }else{
        if (
mysql_errno($conexion)==1062){echo "<h2>No ha podido añadirse el registro</h2>";
            }else{
            
$numerror=mysql_errno($conexion);
            
$descrerror=mysql_error($conexion);
            echo 
"Se ha producido un error nº $numerror que corresponde a: $descrerror  <br>";
        }

}

# cerramos la conexion

 
mysql_close();

?>
</body>
</html>
__________________
LuisTV
[email protected]

Última edición por luistv; 28/04/2004 a las 09:14
  #20 (permalink)  
Antiguo 28/04/2004, 09:37
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 23 años
Puntos: 655
Código PHP:
#aqui se agregó la consulta
$sql="consulta";
$result=mysql_query($sql);
if(
$result && mysql_num_rows($result)>0)
{
no se graba el registro porque existe... pero aparece error en esta línea 
¿Qué contiene la variable $sql? no puede ser la literal consulta, si consulta es una variable, DEBE tener el signo de $ antes, o sea, $consulta.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:14.