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

problema con autoincrement/llave foranea

Estas en el tema de problema con autoincrement/llave foranea en el foro de Bases de Datos General en Foros del Web. buenas!!vean yo tengo estas tablas: create table control( fecha_control date not null, id_inspector integer not null, id_laboratorista integer not null, fecha_entrega_lab date not null, h_ini_ord_1 ...
  #1 (permalink)  
Antiguo 29/03/2010, 23:53
 
Fecha de Ingreso: febrero-2010
Mensajes: 19
Antigüedad: 14 años, 2 meses
Puntos: 1
problema con autoincrement/llave foranea

buenas!!vean yo tengo estas tablas:


create table control(
fecha_control date not null,
id_inspector integer not null,
id_laboratorista integer not null,
fecha_entrega_lab date not null,
h_ini_ord_1 varchar(10),
h_fin_ord_1 varchar(10),
h_ini_ord_2 varchar(10),
h_fin_ord_2 varchar(10),
Primary key (fecha_control),
index(id_inspector,id_laboratorista),
foreign key (id_inspector) references persona(id_persona),
foreign key (id_laboratorista) references persona(id_persona)
)type=innodb;


y esta:


create table produce(
id_control date not null,
numero_vaca integer not null,
c_ord_1 integer not null,
c_ord_2 integer ,
g_ord_1 integer ,
g_ord_2 integer ,
p_ord_1 integer ,
p_ord_2 integer ,
l_ord_1 integer ,
l_ord_2 integer ,
cs_ord_1 integer,
cs_ord_2 integer,
index (id_control,numero_vaca),
foreign key (id_control) references control(fecha_control),
foreign key (numero_vaca) references ganado(numero)
)type=innodb;

y si lo ejecuto en MYSQL me genera las tablas correctamente :)
lo q pasa es que necesito que mi tabla control ahora lleve una columna autoincrement..tons lo hago asi:

create table control(
contador integer AUTO_INCREMENT not null,
fecha_control date not null,
id_inspector integer not null,
id_laboratorista integer not null,
fecha_entrega_lab date not null,
h_ini_ord_1 varchar(10),
h_fin_ord_1 varchar(10),
h_ini_ord_2 varchar(10),
h_fin_ord_2 varchar(10),
Primary key (contador,fecha_control),
index(id_inspector,id_laboratorista),
foreign key (id_inspector) references persona(id_persona),
foreign key (id_laboratorista) references persona(id_persona)
)type=innodb;

y la tabla produce queda igual...
lo que pasa es que si lo hago asi me da error...y el error es en la columna contador que es autoincrement...no se que será, de verdad agradesco su ayuda!!!

el error q me sale es el siguiente:
#1005 - No puedo crear tabla 'ganaderiadb.produce' (Error: 150) (<a href="server_engines.php?engine=InnoDB&amp;page=St atus&amp;token=d9189a9947adda6a29248cbe7562fde3">D etalles...</a>)
  #2 (permalink)  
Antiguo 30/03/2010, 06:35
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: problema con autoincrement/llave foranea

Creo que lo que tratas de hacer no es posible.
Para que un campo sea autoincrement necesariamente tiene que ser primary key y no puede hacer parte de una key compuesta de 2 campos.

De igual forma, si quieres un autoincrementable no veo la necesidad de que tengas una primary key compuesta. Con el solo campo autonumerico basta y sobra.

La tabla quedaría:
Código SQL:
Ver original
  1. CREATE TABLE control(
  2. contador INTEGER AUTO_INCREMENT PRIMARY KEY,
  3. fecha_control DATE NOT NULL,
  4. id_inspector INTEGER NOT NULL,
  5. id_laboratorista INTEGER NOT NULL,
  6. fecha_entrega_lab DATE NOT NULL,
  7. h_ini_ord_1 VARCHAR(10),
  8. h_fin_ord_1 VARCHAR(10),
  9. h_ini_ord_2 VARCHAR(10),
  10. h_fin_ord_2 VARCHAR(10),
  11. INDEX(id_inspector,id_laboratorista),
  12. FOREIGN KEY (id_inspector) REFERENCES persona(id_persona),
  13. FOREIGN KEY (id_laboratorista) REFERENCES persona(id_persona)
  14. )TYPE=innodb;

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 30/03/2010, 07:49
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: problema con autoincrement/llave foranea

Por un lado, es cierto que no te conviene usar campo autoincrement como parte de una PK, como bien te dice Huesos52, porque eso puede dar lugar a ingresar en el resto de los campos valores repetidos, ya que una parte de la clave (el auto_increment) siempre variará, con lo que se cumplirá la restricción, sin por ello evitar la duplicidad de registros.
¿Se entiende la idea?
Eso sería, en ese caso valido:
Código MySQL:
Ver original
  1. DROP TABLE IF EXISTS `test`.`uno`;
  2. CREATE TABLE  `test`.`uno` (
  3.   `UNO` int(11) NOT NULL auto_increment,
  4.   `DOS` varchar(45) NOT NULL,
  5.   PRIMARY KEY  USING BTREE (`UNO`,`DOS`)
  6.  
  7. +-----+-----+
  8. | UNO | DOS |
  9. +-----+-----+
  10. |   1 | ABC |
  11. |   2 | ABC |
  12. |   3 | ABC |
  13. |   4 | ABB |
  14. |   5 | ABB |
  15. +-----+-----+
Como podrás ver, la tabla tiene definida una PK de dos campos, uno de los cuales es un auto_increment; esto es perfectamente válido. Pero eso no evita que el segundo campo se repita...

Por otro lado, es muy posible que el error de generación de la tabla se deba a otras cosas:
1) Las tablas referidas como FK se deben crear antes de cualquier tabla dependiente.
2) TYPE es una cláusula obsoleta. Corresponde usar ENGINE.
3) Los tipos de datos deben ser iguales en tipo y rango entre FK y PK referida, y si son de caracteres, deben ser del mismo CHARSET.
4) Las FK deben ser exactamente iguales en cantidad de columnas y tipos de datos a las PK. No puedes definir, como lo haces, una FK apuntando a un sólo dato de otra tabla (produce->control), y luego pretender modificar la PK de esa tabla (control), porque viola la relación dada.

Así pues, por lo menos verifica que la tabla "persona" sea creada antes que "control", y "control" antes de "produce".
Más o menos por allí hay que empezar.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 30/03/2010, 16:34
 
Fecha de Ingreso: febrero-2010
Mensajes: 19
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: problema con autoincrement/llave foranea

gracias a los dos!! pero lo que dice gnzsoloyo es maso menos lo que quiero hacer!!!
yo le pongo a fecha cm primary key porque necesito que ella no se repita!!! y al auto_incremente la pongo cm primary key porque parece q tiene q ir asi...me entienden :)... creo q cn lo me respondieron me sirve lo que menciono anteriormente ("Por otro lado, es muy posible que el error de generación de la tabla se deba a otras cosas") eso ya lo tome en cuenta gracias tambien!!!...
bueno si no corrigo el error ahi le reporto jeje
gracias otra vez!!
  #5 (permalink)  
Antiguo 31/03/2010, 11:48
 
Fecha de Ingreso: febrero-2010
Mensajes: 19
Antigüedad: 14 años, 2 meses
Puntos: 1
Respuesta: problema con autoincrement/llave foranea

a lo ultimo lo hice cm me lo plantaron y no me sirvio me aparecio el mismo error pero gracias a los que me dijeron pude hacerlo de esta manera...

create table control(
contador integer AUTO_INCREMENT not null,
fecha_control date not null unique,
id_inspector integer not null,
id_laboratorista integer not null,
fecha_entrega_lab date not null,
h_ini_ord_1 varchar(10),
h_fin_ord_1 varchar(10),
h_ini_ord_2 varchar(10),
h_fin_ord_2 varchar(10),
Primary key (contador),
index(id_inspector,id_laboratorista),
foreign key (id_inspector) references persona(id_persona),
foreign key (id_laboratorista) references persona(id_persona)
) ENGINE=INNODB;


create table produce(
id_control date not null,
numero_vaca integer not null,
c_ord_1 integer not null,
c_ord_2 integer ,
g_ord_1 integer ,
g_ord_2 integer ,
p_ord_1 integer ,
p_ord_2 integer ,
l_ord_1 integer ,
l_ord_2 integer ,
cs_ord_1 integer,
cs_ord_2 integer,
index (id_control,numero_vaca),
foreign key (id_control) references control(fecha_control),
foreign key (numero_vaca) references ganado(numero)
)ENGINE=innodb;


ojala a alguien le sirva!!! y gracias a ustedes tambien

Última edición por sosaj21; 31/03/2010 a las 11:58

Etiquetas: foreignkey
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 00:09.