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

Definir llave primaria con 4 campos

Estas en el tema de Definir llave primaria con 4 campos en el foro de Mysql en Foros del Web. Tengo el siguiente diseño de tabla: <? $resultado=mysql_query("CREATE TABLE ".$tabla." ( suc char(4) not null primary key, fecha date not null, tm int(3) not null, ...
  #1 (permalink)  
Antiguo 01/04/2010, 03:30
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Definir llave primaria con 4 campos

Tengo el siguiente diseño de tabla:

<?
$resultado=mysql_query("CREATE TABLE ".$tabla." (
suc char(4) not null primary key,
fecha date not null,
tm int(3) not null,
folio int(6) not null,
es int(1) not null,
cant int(6) not null,
articulo int(8) not null,
hora time not null,
tipo int(1) not null
)",$link);
?>

Deseo que la llave sea:
$suc + $fecha + $tm + $folio

Preguntas:
¿Como defino este tipo de llave?
  #2 (permalink)  
Antiguo 02/04/2010, 19:11
 
Fecha de Ingreso: febrero-2010
Mensajes: 57
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Definir llave primaria con 4 campos

No puedes tener 4 llaves primarias en una misma tabla, sólo debe haber una llave primaria, y varias foráneas, que podrían ser llaves primarias de otras tres tablas diferentes.

Es decir que por cada tabla hay sólo una llave primaria y si deseas conectar una tabla con otras, usas la llave foránea para usar también sus llaves primarias.

Recuerda que en la llave primaria no puede haber otro registro que tenga el mismo valor de la llave primaria ni valores repetidos. Es Unica.

Ejemplo:

CREATE TABLE sucursales (
id_suc int not null primary key,
suc char(4) not null,
fecha refences table fechas (id_fecha),
tm refences table tms (id_tm),
folio refences table folios (id_folio),
es int(1) not null,
cant int(6) not null,
articulo int(8) not null,
hora time not null,
tipo int(1) not null)

CREATE TABLE fechas (
id_fecha int not null primary key,
fecha date not null )

CREATE TABLE tms (
id_tm int not null primary key,
tm int(3) date not null )

CREATE TABLE folios (
id_folio int not null primary key,
folio int(6) not null )

No recuerdo la sintaxis para hacer referencia a un campo de otra tabla, pero mas o menos es asi (eso te queda de tarea)... pero, si te das cuenta todas las tablas del ejemplo, manejan un id para que tener identificada fila y se puedan usar como referencia de otra.


Te recomiendo leas la info de esta liga:

http://es.wikipedia.org/wiki/Base_de_datos_relacional



Espero haber sido explicita.

Saludos,
Marsh_Spider
  #3 (permalink)  
Antiguo 02/04/2010, 20:11
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Definir llave primaria con 4 campos

Cita:
Iniciado por Marsh_Spider Ver Mensaje
No puedes tener 4 llaves primarias en una misma tabla, sólo debe haber una llave primaria, y varias foráneas, que podrían ser llaves primarias de otras tres tablas diferentes.

Es decir que por cada tabla hay sólo una llave primaria y si deseas conectar una tabla con otras, usas la llave foránea para usar también sus llaves primarias.

Recuerda que en la llave primaria no puede haber otro registro que tenga el mismo valor de la llave primaria ni valores repetidos. Es Unica.

Ejemplo:

...Continúa.
Estimado Marsh_Spider,
Gracias por tus comentarios.
  • Tengo una tabla en la cual almaceno las ventas. ($tm ="S")
  • Varios usuarios que almacenan sus ventas en esta misma tabla. (Sucursal)
  • Cada usuario lleva un folio consecutivo para cada venta. (Folio)
  • Además, cada usuario registra entradas de producto. ($tm ="E")

mi tabla tendría algo así como los siguientes campos:
  • $sucursal char(4); # Sucursal
  • $fecha date; # fecha
  • $tipodemovimiento char(1); # Tipo de movimiento (E o S)
  • $folio char(6); # Folio del movimiento
  • $articulo char(9); # Código del artículo
  • $cantidad char(4); # Sucursal

El contenido de la tabla sería algo (conforme se capturó la información):
1) 0001 / 2010-03-11 / E / 000001 / K1 / 10
2) 0001 / 2010-03-15 / S / 000001 / K1 / 1
3) 0002 / 2010-04-20 / E / 000001 / K1 / 15
4) 0001 / 2010-04-21 / E / 000002 / K2 / 2
5) 0001 / 2010-04-22 / E / 000001 / K2 / 10
6) 0001 / 2010-04-22 / S / 000003 / K1 / 2
7) 0002 / 2010-04-23 / S / 000002 / K1 / 5
(Para este ejemplo he numerado cada renglón del lado izquierdo)

Deseo generar una consulta de estos registros ordenados por sucursal y en cada sucursal ordenado por Tipo de Movimiento, y cada tipo de movimiento ordenado por artículo, por lo que requiero obtener:

En base a ordenar esta tabla, deberé obtener el siguiente resultado:
1) 0001 / 2010-03-11 / E / 000001 / K1 / 10
6) 0001 / 2010-04-22 / S / 000003 / K1 / 2
2) 0001 / 2010-03-15 / S / 000001 / K1 / 1
4) 0001 / 2010-04-21 / E / 000002 / K2 / 2
5) 0001 / 2010-04-22 / E / 000001 / K2 / 10
3) 0002 / 2010-04-20 / E / 000001 / K1 / 15
7) 0002 / 2010-04-23 / S / 000002 / K1 / 5

Como se puede apreciar, el orden de los renglones ha cambiado.

Yo programo en otros lenguajes, donde solo me basta definir una llave "compuesta", la cual contiene el orden deseado de la llave, para la cual se especifican los campos que debe considerar, algo así como:

$LLAVE = $sucursal . $TipoDeMovimiento . $Articulo;

Y con esta llave puedo incluso verificar que no sea duplicada.

Espero haberme explicado.
Gracias

Última edición por Bier; 02/04/2010 a las 21:59 Razón: Acomodo de renglones
  #4 (permalink)  
Antiguo 02/04/2010, 20:43
 
Fecha de Ingreso: febrero-2010
Mensajes: 57
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: Definir llave primaria con 4 campos

Lamento haber herido susceptibilidades.... no era mi intención.
Y te ofrezco una disculpa por no haber entendido con detalle lo que necesitabas.

Pero puedes revisar la siguiente información:

http://dev.mysql.com/doc/refman/5.0/...nstraints.html



Saludos,
Marsh_Spider

Última edición por Marsh_Spider; 02/04/2010 a las 20:49
  #5 (permalink)  
Antiguo 02/04/2010, 21:15
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Definir llave primaria con 4 campos

Cita:
Iniciado por Marsh_Spider Ver Mensaje
Lamento haber herido susceptibilidades.... no era mi intención.
Y te ofrezco una disculpa por no haber entendido con detalle lo que necesitabas.

Pero puedes revisar la siguiente información:

http://dev.mysql.com/doc/refman/5.0/...nstraints.html



Saludos,
Marsh_Spider
Estimado Marsh_Spider,
Agradezco infinitamente tus aportaciones. Te anticipo que solamente he percibido positivismo, nunca lo contrario, por lo que no hay disculpa que dar, ni mucho menos.

Leeré con atención lo que siguieres.

Considero que parte de mi problema (y ventaja en muchos casos), es que vengo de programar por años en otros lenguajes, y no se si PHP/MySQL puedan hacer lo que estoy acostumbrado.

Gracias, saludos , muy amable.

Bier.
  #6 (permalink)  
Antiguo 03/04/2010, 02:07
Avatar de StevKenshinX  
Fecha de Ingreso: noviembre-2008
Ubicación: Lima
Mensajes: 28
Antigüedad: 15 años, 5 meses
Puntos: 2
Exclamación Respuesta: Definir llave primaria con 4 campos

La consulta segun lo ke pides con tu ejemplo seria :

La tabla se llama bier ¬¬ :

Cita:
select * from bier ORDER BY sucursal,articulo
Pero lo que tu idea expresa antes del resultado ke pides seria esto:

Cita:
select * from bier ORDER BY sucursal,tipomovimiento,articulo
Saludos -. -!
  #7 (permalink)  
Antiguo 03/04/2010, 03:10
 
Fecha de Ingreso: enero-2002
Mensajes: 1.174
Antigüedad: 22 años, 3 meses
Puntos: 21
Respuesta: Definir llave primaria con 4 campos

Gracias StevKenshinX,

Tal y como lo explicas es como lo estoy realizando y trabaja perfecto.

En otras bases de datos (en otros lenguajes) , los indices son archivos que físicamente existen. La información de la tabla se despliega en el orden que le indica el índice.

Ahora veo que este índice (con la instrucción select * from bier ORDER BY sucursal,tipomovimiento,articulo) realmente no existe, más bien la construye "al momento".

Imaginé que podía crear un índice con estos campos y solo hacer referencia al índice, pero creo debo ajustarme a lo que comentas.

Gracias por tus comentarios, seguiré tal y como comentas.

Saludos

Etiquetas: campos, definir, llave, primaria
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 08:32.