Ver Mensaje Individual
  #7 (permalink)  
Antiguo 27/09/2009, 09:24
Avatar de gnzsoloyo
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: delete con inner join

Bien, finalmente conseguí en una página que tenía ejercicios sobre DELETE en MySQL un script de prueba para el caso, y lo probé.
Funcionó tras unas modificaciones.

El tema pasa por establecer el orden de borrado, y definir específicamente qué tabla es la que se va a borrar, ya que el DELETE puede abarcar todas las tablas, algunas o una sola de las involucradas
El script que usé es este:
Código sql:
Ver original
  1. DROP TABLE IF EXISTS AuthorArticle;
  2. DROP TABLE IF EXISTS Articles;
  3. DROP TABLE IF EXISTS Authors;
  4.  
  5.  
  6.  
  7. CREATE TABLE Articles (
  8.    ArticleID SMALLINT NOT NULL PRIMARY KEY,
  9.    ArticleTitle VARCHAR(60) NOT NULL,
  10.    Copyright YEAR NOT NULL
  11. )
  12. ENGINE=INNODB;
  13.  
  14.  
  15. INSERT INTO Articles VALUES (12786, 'How write a paper', 1934),
  16.                             (13331, 'Publish a paper', 1919),
  17.                             (14356, 'Sell a paper', 1966),
  18.                             (15729, 'Buy a paper', 1932),
  19.                             (16284, 'Conferences', 1996),
  20.                             (17695, 'Journal', 1980),
  21.                             (19264, 'Information', 1992),
  22.                             (19354, 'AI', 1993);
  23.  
  24.  
  25. CREATE TABLE Authors (
  26.    AuthID SMALLINT NOT NULL PRIMARY KEY,
  27.    AuthorFirstName VARCHAR(20),
  28.    AuthorMiddleName VARCHAR(20),
  29.    AuthorLastName VARCHAR(20)
  30. )
  31. ENGINE=INNODB;
  32.  
  33.  
  34. INSERT INTO Authors VALUES (1006, 'Henry', 'S.', 'Thompson'),
  35.                            (1007, 'Jason', 'Carol', 'Oak'),
  36.                            (1008, 'James', NULL, 'Elk'),
  37.                            (1009, 'Tom', 'M', 'Ride'),
  38.                            (1010, 'Jack', 'K', 'Ken'),
  39.                            (1011, 'Mary', 'G.', 'Lee'),
  40.                            (1012, 'Annie', NULL, 'Peng'),
  41.                            (1013, 'Alan', NULL, 'Wang'),
  42.                            (1014, 'Nelson', NULL, 'Yin');
  43.  
  44.  
  45. CREATE TABLE AuthorArticle (
  46.    AuthID SMALLINT NOT NULL,
  47.    ArticleID SMALLINT NOT NULL,
  48.    PRIMARY KEY (AuthID, ArticleID),
  49.    FOREIGN KEY (AuthID) REFERENCES Authors (AuthID),
  50.    FOREIGN KEY (ArticleID) REFERENCES Articles (ArticleID)
  51. )
  52. ENGINE=INNODB;
  53.  
  54.  
  55. INSERT INTO AuthorArticle VALUES (1006, 14356),
  56.                               (1008, 15729),
  57.                               (1009, 12786),
  58.                               (1010, 17695),
  59.                               (1011, 15729),
  60.                               (1012, 19264),
  61.                               (1012, 19354),
  62.                               (1014, 16284);
En este ejemplo existe una dependencia entre la tabla AuthorArticle y las otras dos, por lo cual para eliminar cualquiera de los registros ubicados en Author y Article, primero hay que eliminar el registro donde se vinculan en AuthorArticle.
Para lograrlo no podemos hacer:
Código sql:
Ver original
  1. DELETE  
  2. FROM Authors a INNER JOIN AuthorArticle ab USING(AuthID)
  3.    INNER JOIN Articles b USING(ArticleID)
  4. WHERE AuthorLastName='Elk';
porque eso implicaría que los registros se borren de las tablas en esta secuencia: Authors -> AuthorArticle -> Article , lo que genera un problema de restricción de FK.
Para lograr que se borren, hay que establecer la secuencia de otra forma: AuthorsArticle -> Author -> Article.
Esto sería:
Código sql:
Ver original
  1. DELETE ab, b
  2. FROM Authors a INNER JOIN AuthorArticle ab USING(AuthID)
  3.    INNER JOIN Articles b USING(ArticleID)
  4. WHERE AuthorLastName='Elk';
y luego eliminar el tercer registro en la primera tabla:
Código sql:
Ver original
  1. DELETE a
  2. FROM Authors a;
(todavía no analicé por qué no me deja borrar todos juntos).

En el caso debería funcionar con:
Código sql:
Ver original
  1. DELETE lg
  2. FROM tbllogrosxgrado lxg
  3.             INNER JOIN tbllogros lg USING(id_logro)
  4. WHERE lxg.identificacion='1036606448';
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)