MySQL - No graba datos en tablas relacionadas

 
Vista:
sin imagen de perfil

No graba datos en tablas relacionadas

Publicado por Mario (4 intervenciones) el 18/02/2015 16:48:32
Hola a todos, cordial saludo. Tengo un proyecto en el que necesito ingresar unos datos a 4 tablas relacionadas, el problema es que me saca el error: Cannot add or update a child row: a foreign key constraint fails (`roldanillo`.`demandante`, CONSTRAINT `demandante_ibfk_1` FOREIGN KEY (`iddte`) REFERENCES `radicacion` (`idradicacion`) ON DELETE CASCADE ON UPDATE CASCADE). La base de datos es Mysql y las conexiones y formulario los hice con Dreamweaver. Tengo conocimientos someros y no había tenido problemas en manejar una sola tabla pero con varias y relacionadas con Dreamweaver no lo he podido hacer. Agradezco la orientación ya que he buscado información pero no hay algo que me saque del problema, lo que tengo entendido es que el problema son las id autoincrementales, desde ya mil gracias. Adjunto código de las tablas y PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
CREATE TABLE `radicacion` (
 `idradicacion` int(11) NOT NULL AUTO_INCREMENT,
 `radicacion` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
 `instancia` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
 `proceso` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
 `subclase` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
 `daterepar` date NOT NULL,
 `observacion` varchar(535) COLLATE utf8_spanish_ci NOT NULL,
 `matinm` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
 `namepred` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
 `classmed` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
 PRIMARY KEY (`idradicacion`),
 UNIQUE KEY `radicacion` (`radicacion`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci
 
CREATE TABLE `demandante` (
 `iddatosdte` int(11) NOT NULL AUTO_INCREMENT,
 `dte` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
 `ccnitdte` varchar(20) COLLATE utf8_spanish_ci NOT NULL,
 `dirteldte` varchar(60) COLLATE utf8_spanish_ci NOT NULL,
 `iddte` int(11) NOT NULL,
 PRIMARY KEY (`iddatosdte`),
 KEY `iddte` (`iddte`),
 CONSTRAINT `demandante_ibfk_1` FOREIGN KEY (`iddte`) REFERENCES `radicacion` (`idradicacion`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci
 
 
CREATE TABLE `apodte` (
 `idapodte` int(11) NOT NULL,
 `nameapodte` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
 `dirapodte` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
 `telapodte` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
 `emailapodte` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
 KEY `idapodte` (`idapodte`),
 CONSTRAINT `apodte_ibfk_1` FOREIGN KEY (`idapodte`) REFERENCES `demandante` (`iddatosdte`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci
 
CREATE TABLE `demandado` (
 `iddatosddo` int(11) NOT NULL AUTO_INCREMENT,
 `ddo` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
 `ccnitddo` varchar(20) COLLATE utf8_spanish_ci NOT NULL,
 `dirtelddo` varchar(60) COLLATE utf8_spanish_ci NOT NULL,
 `idddo` int(11) NOT NULL,
 PRIMARY KEY (`iddatosddo`),
 KEY `idddo` (`idddo`),
 CONSTRAINT `demandado_ibfk_1` FOREIGN KEY (`idddo`) REFERENCES `radicacion` (`idradicacion`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci
 
CREATE TABLE `apoddo` (
 `idapoddo` int(11) NOT NULL,
 `nameapoddo` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
 `dirapoddo` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
 `telapoddo` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
 `emailapoddo` varchar(40) COLLATE utf8_spanish_ci NOT NULL,
 KEY `idapoddo` (`idapoddo`),
 CONSTRAINT `apoddo_ibfk_1` FOREIGN KEY (`idapoddo`) REFERENCES `demandado` (`iddatosddo`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }
 
  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
 
  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}
 
$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
  $editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}
 
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO radicacion (radicacion, instancia, proceso, subclase, daterepar, observacion, matinm, namepred, classmed) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)",
                       GetSQLValueString($_POST['radicacion'], "text"),
                       GetSQLValueString($_POST['instancia'], "text"),
                       GetSQLValueString($_POST['proceso'], "text"),
                       GetSQLValueString($_POST['subclase'], "text"),
                       GetSQLValueString($_POST['daterepar'], "date"),
                       GetSQLValueString($_POST['observacion'], "text"),
                       GetSQLValueString($_POST['matinm'], "text"),
                       GetSQLValueString($_POST['namepred'], "text"),
                       GetSQLValueString($_POST['classmed'], "text"));
 
  mysql_select_db($database_roldanillo, $roldanillo);
  $Result1 = mysql_query($insertSQL, $roldanillo) or die(mysql_error());
 
  }
 
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO demandante (dte, ccnitdte, dirteldte) VALUES (%s, %s, %s)",
                       GetSQLValueString($_POST['dte'], "text"),
                       GetSQLValueString($_POST['ccnitdte'], "text"),
                       GetSQLValueString($_POST['dirteldte'], "text"));
 
  mysql_select_db($database_roldanillo, $roldanillo);
  $Result1 = mysql_query($insertSQL, $roldanillo) or die(mysql_error());
}
 
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO apodte (nameapodte, dirapodte, telapodte, emailapodte) VALUES (%s, %s, %s, %s)",
                       GetSQLValueString($_POST['nameapodte'], "text"),
                       GetSQLValueString($_POST['dirapodte'], "text"),
                       GetSQLValueString($_POST['telapodte'], "text"),
                       GetSQLValueString($_POST['emailapodte'], "text"));
 
  mysql_select_db($database_roldanillo, $roldanillo);
  $Result1 = mysql_query($insertSQL, $roldanillo) or die(mysql_error());
}
 
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO demandado (ddo, ccnitddo, dirtelddo) VALUES (%s, %s, %s)",
                       GetSQLValueString($_POST['ddo'], "text"),
                       GetSQLValueString($_POST['ccnitddo'], "text"),
                       GetSQLValueString($_POST['dirtelddo'], "text"));
 
  mysql_select_db($database_roldanillo, $roldanillo);
  $Result1 = mysql_query($insertSQL, $roldanillo) or die(mysql_error());
}
 
if ((isset($_POST["MM_insert"])) && ($_POST["MM_insert"] == "form1")) {
  $insertSQL = sprintf("INSERT INTO apoddo (nameapoddo, dirapoddo, telapoddo, emailapoddo) VALUES (%s, %s, %s, %s)",
                       GetSQLValueString($_POST['nameapoddo'], "text"),
                       GetSQLValueString($_POST['dirapoddo'], "text"),
                       GetSQLValueString($_POST['telapoddo'], "text"),
                       GetSQLValueString($_POST['emailapoddo'], "text"));
 
  mysql_select_db($database_roldanillo, $roldanillo);
  $Result1 = mysql_query($insertSQL, $roldanillo) or die(mysql_error());
$insertGoTo = "messagereg.php";
  if (isset($_SERVER['QUERY_STRING'])) {
    $insertGoTo .= (strpos($insertGoTo, '?')) ? "&" : "?";
    $insertGoTo .= $_SERVER['QUERY_STRING'];
  }
  header(sprintf("Location: %s", $insertGoTo));
 
}
?>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

No graba datos en tablas relacionadas

Publicado por Leopoldo Taylhardat (44 intervenciones) el 18/02/2015 20:35:46
Saludos...

Debes almacenar primero los valores en la(s) tabla(s) principales... no puedes almacenar si no existe la dependencia...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

No graba datos en tablas relacionadas

Publicado por Mario (4 intervenciones) el 18/02/2015 22:36:43
Hola, eso hago pero el problema es que con el código no se vincular el id autoincremental de la tabla primaria a la foránea, se que se puede hacer con mysql_insert_id(),; pero no se aplicarlo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Xavi
Val: 39
Ha aumentado su posición en 2 puestos en MySQL (en relación al último mes)
Gráfica de MySQL

No graba datos en tablas relacionadas

Publicado por Xavi (14 intervenciones) el 19/02/2015 07:47:43
Hola Mario, en al tabla demandante, has creado un campo (iddte) que es una clave foranea al idradicación de la tabla radicacion, y en tu insert, no añades dicho valor... si no lo añades, no te debería de agregar el registro y por lo tanto dar un error.

Despues del primer insert tienes que coger el id que ha generado... algo así:
1
2
$Result1 = mysql_query($insertSQL, $roldanillo) or die(mysql_error());
$lastId=mysql_insert_id();

Ahora, en el siguiente insert, ya puedes utilizarlo.
1
2
3
4
5
$insertSQL = sprintf("INSERT INTO demandante (dte, ccnitdte, dirteldte, iddte) VALUES (%s, %s, %s)",
    GetSQLValueString($_POST['dte'], "text"),
    GetSQLValueString($_POST['ccnitdte'], "text"),
    GetSQLValueString($_POST['dirteldte'], "text"),
    $lastId);


Te comento algunas cosas que veo...
- No hace falta seleccionar la base de datos cada vez que vas a hacer un insert... con que la selecciones una vez es suficiente.
- Las instrucciones mysql_* están en desuso... en próximas versiones dejaran de funcionar... te recomiendo utilizar PDO para trabajar con las bases de datos.


Ya nos comentaras si te funciono
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

No graba datos en tablas relacionadas

Publicado por Mario (4 intervenciones) el 19/02/2015 15:58:58
Leopoldo Mil gracias por tu ayuda, ya pude solucionar y registrar en todos los campos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

No graba datos en tablas relacionadas

Publicado por Mario (4 intervenciones) el 23/02/2015 16:58:07
Leopoldo una última consulta, siguiendo con el mismo proyecto como se hace para vincular todas las tablas para consultar y actualizarlas por el ID. Pues solo me carga datos de radicación pero las relacionadas no. Adjunto código. Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

No graba datos en tablas relacionadas

Publicado por Leopoldo Taylhardat (44 intervenciones) el 24/02/2015 18:31:40
Saludos...
De actualizar varias tablas no se puede (en teoría)...ya que el update solo actualiza una tabla...
si quieres varios procesos simultáneos depende se lo que quieras... por ejemplo si quieres que al cambiar la columna de la dependencia en la tabla principal se actualicen las dependientes debes colocar en la clave foránea para el update "en cascada" (lo mismo sirve para el delete... elimina el "padre" elimina las dependencias).

otra forma es a través de triggers, funciones y/o procedimientos de la base de datos...
ejemplo simple...
si tienes un "valor acumulado" en la tabla principal y al agregar /modificar o eliminar registros en las tablas dependientes...
colocas un trigger que suma o resta el valor de la tabla dependiente en la tabla principal... y el (o los) trigger(s) se le crean a la tabla dependiente...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar