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

    Inserire un record progressivo

    Io ho un sito che vorrei assegnasse un nome temporaneo agli utenti
    esempio: Senzanome_213 (Unnamed_213 in inglese)
    seguendo un ordine progressivo.
    Per farlo pensavo di contare quanti record avessero la stringa che conteneva Unnamed_
    incrementare+1 e poi inserire il record con un concat
    ma la cosa sembra non piacere a MySQL.

    codice:
    UPDATE users
    5ET name=concat('Unnamed_',(SELECT count(name)+1 FROM users WHERE name LIKE 'Unnamed_%'))
    WHERE id=1
    LIMIT 1
    Errore: Error Code: 1093. You can't specify target table 'users' for update in FROM clause
    Spiegazione: In MySQL, you can't modify the same table which you use in the SELECT part.
    PS:
    Ho rinominato "SET" con "5ET" altrimenti non mi faceva postare sul forum :P
    Il Cavaliere dei Sogni

  2. #2
    Ciao,
    ma perchè non fai il set del id progressivo direttamente in fase di insert anzichè successivamente con l'update?

    Ciao
    Mik

  3. #3
    Intanto mi scuso per il post doppio!
    Ho contattato i moderatori.

    Originariamente inviato da in the web
    Tutte le tabelle InnoDB dovrebbero avere una chiave primaria, in genere AUTO_INCREMENT, quindi basta appendere quel valore alla parola 'user'...
    Uso MyISAM e non InnoDB posso prendere lo stesso tale chiave?.

    Originariamente inviato da in the web
    Puoi anche usare un trigger:
    Preferirei niente trigger, perche devo chiedere al hosting di mettermeli.
    Grazie comunque.

    Originariamente inviato da Holidaysoft.it
    Ciao,
    ma perchè non fai il set del id progressivo direttamente in fase di insert anzichè successivamente con l'update?
    Ho provato con insert ma mi da lo stesso problema
    una subquery che contenga SELECT count(name)+1 FROM users WHERE name LIKE 'Unnamed_%'
    non gli piace proprio.

    Che io sbagli qualcosa?
    Il Cavaliere dei Sogni

  4. #4
    Originariamente inviato da narghat
    Uso MyISAM e non InnoDB posso prendere lo stesso tale chiave?.
    Nè chiavi esterne nè transazioni. Comunque ti consiglio di lasciar perdere MyISAM. E' più veloce solo in rari casi e ha un sacco di limiti.

    Ho provato con insert ma mi da lo stesso problema
    una subquery che contenga SELECT count(name)+1 FROM users WHERE name LIKE 'Unnamed_%'
    non gli piace proprio.

    Che io sbagli qualcosa?
    Eh sì. Non puoi accedere a una tabella con una INSERT e metterci una subquery che accede alla stessa tabella. E' un principio generale di MySQL.

    Fai così

    SET @num = SELECT count(*) FROM users FOR UPDATE;
    INSERT INTO users
    (..., name)
    VALUES
    (..., concat('Unnamed_', @num))
    WHERE id=1;

    Non dimenticare for update, altrimenti potrebbe succedere questo:
    il thread 1 conta i record (20)
    subito dopo il thread 2 conta i record (20)
    il thread 1 crea l'utente unnamed_20
    il thread 2 crea un utente con lo stesso nome
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

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.