Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [SQL] Update con delete

    Ciao..
    Ho una tabella:
    Codice PHP:
    CREATE TABLE `posts2tags` (
      `
    rel_IDint(10NOT NULL auto_increment,
      `
    tag_IDint(10NOT NULL default '0',
      `
    post_IDint(10NOT NULL default '0',
      
    PRIMARY KEY  (`rel_ID`)
    ENGINE=MyISAM DEFAULT CHARSET=utf8
    in cui immetto i valori del tag_ID e relativo
    post_ID ad un post_ID è possibile associare
    + tag_ID.

    In fase di aggiornamento della tabella Posts
    per aggiornare il tutto per adesso faccio
    due cicli uno per il delete e uno per l'insert

    mi domando è possibile fare la stessa cosa
    con una query sola ?



    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  2. #2
    faresti meglio a postare entrambe le tabelle ed a fare un esempio...

    Io non ho capito cosa devi cancellare e cosa inserire...
    Administrator of NAMDesign.Net

  3. #3
    Iniziamo a svegliarsi allora il delete
    l'ho tolto dal ciclo

    e prima di fare l'insert faccio cancellare
    tutti i record con lo stesso post_ID

    rimane aperta la questione se la cosa
    si può fare con una query sola


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  4. #4
    Originariamente inviato da LeaderGL
    faresti meglio a postare entrambe le tabelle ed a fare un esempio...

    Io non ho capito cosa devi cancellare e cosa inserire...
    Codice PHP:
    CREATE TABLE `posts` (
      `
    post_IDint(10unsigned NOT NULL auto_increment,
      `
    category_IDint(5unsigned NOT NULL default '0',
      `
    user_IDint(10unsigned NOT NULL default '0',
      `
    post_titletext NOT NULL,
      `
    post_preambletext NOT NULL,
      `
    post_contentlongtext NOT NULL,
      `
    post_datedatetime NOT NULL default '0000-00-00 00:00:00',
      `
    post_highlightedenum('n','y'NOT NULL default 'n',
      
    PRIMARY KEY  (`post_ID`),
      
    KEY `category_ID` (`category_ID`),
      
    KEY `user_ID` (`user_ID`)
    ENGINE=MyISAM DEFAULT CHARSET=utf8

    Codice PHP:
    CREATE TABLE `tags` (
      `
    tag_IDint(10NOT NULL auto_increment,
      `
    tag_namevarchar(255NOT NULL default '',
      
    PRIMARY KEY  (`tag_ID`),
      
    UNIQUE KEY `tag_name` (`tag_name`)
    ENGINE=MyISAM DEFAULT CHARSET=utf8

    Ecco le altre due tabelle per l'esempio
    quando inserisco un post ho la possibiltà
    di inserire + tags di qui la tabella posts2tags

    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  5. #5
    Allora, ok...puoi fare una cosa di questo tipo:
    1) Invece di avere 3 tabelle (2 principali ed 1 di relazione) ne crei solo 2 e nella seconda metti un riferimento (chiave esterna) alla prima.
    2) Aggiungi, se puoi creare database di tipo INNODB, un evento ON DELETE alla seconda tabella.

    codice:
    CREATE TABLE `posts` ( 
      `post_ID` int(10) unsigned NOT NULL auto_increment, 
      `category_ID` int(5) unsigned NOT NULL default '0', 
      `user_ID` int(10) unsigned NOT NULL default '0', 
      `post_title` text NOT NULL, 
      `post_preamble` text NOT NULL, 
      `post_content` longtext NOT NULL, 
      `post_date` datetime NOT NULL default '0000-00-00 00:00:00', 
      `post_highlighted` enum('n','y') NOT NULL default 'n', 
      PRIMARY KEY  (`post_ID`), 
      KEY `category_ID` (`category_ID`), 
      KEY `user_ID` (`user_ID`) 
    ) ENGINE=INNODB;
    codice:
    CREATE TABLE `tags` (
      `post_ID` int(10) unsigned NOT NULL, 
      `tag_ID` int(10) NOT NULL auto_increment, 
      `tag_name` varchar(255) NOT NULL default '', 
      PRIMARY KEY  (`post_ID`, `tag_ID`), 
      FOREIGN KEY (`post_ID`) REFERENCES `posts`(`post_ID`) ON DELETE CASCADE,
      UNIQUE KEY `tag_name` (`tag_name`) 
    ) ENGINE=INNODB;
    In questo modo quando elimini un "post" automaticamente verranno elimitati tutti i "tag" relativi a quel post.

    Potresti anche usare i trigger, che sono degli eventi che si scatenano in base a qualcosa che programmi tu. Nel tuo caso puoi fare che ogni volta che si cerca di cancellare qualcosa da "posts" automaticamente si avvia una procedura (trigger) MySQL che cancella i relativi "tags".

    In questo modo da PHP dovrai semplicemente cancellare un post senza preoccuparti dei tags.

    Spero di esserti stato di aiuto...
    Administrator of NAMDesign.Net

  6. #6
    Grazie della risposta
    guardo un po cosa ci posso
    ricavare.
    La tua soluzione però non permette
    una gestione separata dei tags cosa
    che volevo ottenere dallo script.






    Ps.
    Grazie cq perchè mi hai fatto vedere
    la cosa da un altro punto di vista
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  7. #7
    Ripensandoci
    CREATE TABLE `tags` (
    `post_ID` int(10) unsigned NOT NULL,
    `tag_ID` int(10) NOT NULL auto_increment,
    `tag_name` varchar(255) NOT NULL default '',
    PRIMARY KEY (`post_ID`, `tag_ID`),
    FOREIGN KEY (`post_ID`) REFERENCES `posts`(`post_ID`) ON DELETE CASCADE,
    UNIQUE KEY `tag_name` (`tag_name`)
    ) ENGINE=INNODB;
    il tag_ID come lo inserisci a regola
    andrebbe inserito in fase di insert
    del post .......


    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

  8. #8
    Nella progettazione di database quando si devono creare relazioni ti tipo "UNO A MOLTI" ci sono due strade da prendere:

    1) Quella che hai preso tu, avere due tabelle distinte più una terza che realizza la relazione
    2) Quella che ti ho suggerito io, avere due sole tabelle ed inserire nella seconda un riferimento alla chiave primaria dell'altra tabella

    Nel tuo caso la soluzione 2 ti aiuterebbe nella cancellazione dei "tags" e ti eviterebbe di avere un'altra tabella con 2 soli attributi ed un miliardo di tuple.

    La soluzione 1 sarebbe andata bene nel momento in cui ci sarebbero dovuti essere altri attributi per la relazione e non tutti questi sarebbero stati valorizzati.

    P.S. Ma stai realizzando un forum?

    In ogni caso con le tabelle che ti ho proposto avresti questo scenario:

    [list=1][*]Creazione tupla in "posts" (e credo che questo comporti anche la creazione del primo "tags"):
    codice:
    INSERT INTO posts(CATEGORY_ID, POST_TITLE, ...)VALUES('$category_id', '$post_title', ...);
    
    INSERT INTO tags(POST_ID, ...)VALUES('$post_id', ...);
    si è presupposto che POST_ID sia un auto_increment e quindi nella prima INSERT non è stato inserito e che invece il valore $post_id della seconda insert sia stato reperito da PHP tramite la funzione mysql_insert_id()
    [*]Cancellazione di un "tags":
    codice:
    DELETE FROM tags WHERE tag_id = '5'
    [*]Cancellazione di un "posts" e relativi "tags":
    codice:
    DELETE FROM posts WHERE post_id = '5'
    automaticamente verranno eliminati tutti i "tags" relativi a quel "post"[/list=1]

    Sono questi i tuoi unici scenari giusto? o mi sfugge qualcosa?
    Administrator of NAMDesign.Net

  9. #9
    P.S. Ma stai realizzando un forum?
    No un blog.


    Ti ringrazio ancora della tua collaborazione
    ma valutati pro e contro delle due
    soluzioni ho deciso di adottare la prima.
    (a conti fatti le query sono le stesse
    e la creazione di una tabella rel
    permette una gestione migliore dei tags
    svincolati dai posts)

    Per quanto riguarda i delete ho
    risolto in questo modo:

    per i tags:

    DELETE tags, posts2tags FROM tags left join posts2tags
    USING (tag_ID) WHERE tags.tag_ID='5';
    per i posts:

    DELETE posts, posts2tags FROM posts left join posts2tags
    USING (post_ID) WHERE posts.post_ID='5';





    il delete è di Luca200
    Without faith, nothing is possible. With it, nothing is impossible
    http://ilwebdifabio.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.