Domanda

Qual è la differenza tra TRUNCATE e DELETE in SQL?

Se la tua risposta è specifica della piattaforma, ti preghiamo di indicarlo.

È stato utile?

Soluzione

Ecco un elenco di differenze. Ho messo in evidenza le funzionalità specifiche di Oracle e, si spera, la community può aggiungere anche la differenza specifica di altri fornitori. Le differenze comuni alla maggior parte dei fornitori possono andare direttamente sotto le intestazioni, con le differenze evidenziate di seguito.


Panoramica generale

Se vuoi eliminare rapidamente tutte le righe da una tabella e sei davvero sicuro di volerlo fare, e non hai chiavi esterne contro le tabelle, probabilmente un TRUNCATE sarà più veloce di un ELIMINA.

Devono essere presi in considerazione vari problemi specifici del sistema, come spiegato di seguito.


Tipo di istruzione

Elimina è DML, Troncato è DDL ( Che cos'è DDL e DML? )


Commit and Rollback

Variabile per fornitore

SQL * Server

Il troncamento può essere ripristinato.

PostgreSQL

Il troncamento può essere ripristinato.

Oracle

Poiché un TRUNCATE è DDL, comporta due commit, uno prima e uno dopo l'esecuzione dell'istruzione. Pertanto, non è possibile eseguire il rollback di Truncate e un errore nel processo di troncamento avrà comunque eseguito un commit.

Tuttavia, vedi Flashback di seguito.


Bonifica dello spazio

Elimina non recupera spazio, Tronca recupera spazio

Oracle

Se si utilizza la clausola REUSE STORAGE, i segmenti di dati non vengono disallocati, il che può essere marginalmente più efficiente se la tabella deve essere ricaricata con i dati. Il segno di alta marea viene ripristinato.


Ambito di riga

Elimina può essere utilizzato per rimuovere tutte le righe o solo un sottoinsieme di righe. Troncare rimuove tutte le righe.

Oracle

Quando una tabella viene partizionata, le singole partizioni possono essere troncate in modo isolato, quindi è possibile una parziale rimozione di tutti i dati della tabella.


Tipi di oggetti

Elimina può essere applicato a tabelle e tabelle all'interno di un cluster. Troncare si applica solo alle tabelle o all'intero cluster. (Può essere specifico per Oracle)


Identità oggetto dati

Oracle

Elimina non influisce sull'ID oggetto dati, ma il troncamento assegna un nuovo ID oggetto dati a meno che non vi sia mai stato un inserimento contro la tabella dalla sua creazione Anche un singolo inserto che viene eseguito il rollback causerà un nuovo ID oggetto dati da assegnare al troncamento.


Flashback (Oracle)

Il flashback funziona attraverso le eliminazioni, ma un troncamento impedisce il flashback agli stati prima dell'operazione.

Tuttavia, da 11gR2 la funzione ARCHIVIO FLASHBACK lo consente, tranne che in Express Edition

Uso di FLASHBACK in Oracle http://docs.oracle.com/cd/ E11882_01 / appdev.112 / e41502 / adfns_flashback.htm # ADFNS638


Privilegi

Variabile

Oracle

L'eliminazione può essere concessa su una tabella a un altro utente o ruolo, ma il troncamento non può avvenire senza l'utilizzo di una sovvenzione DROP ANY TABLE.


Ripristina / Annulla

Elimina genera una piccola quantità di ripetizione e una grande quantità di annullamento. Troncare genera una quantità trascurabile di ciascuno.


Indici

Oracle

Un'operazione troncata rende nuovamente utilizzabili gli indici inutilizzabili. Elimina no.


Chiavi esterne

Un troncato non può essere applicato quando una chiave esterna abilitata fa riferimento alla tabella. Il trattamento con cancellazione dipende dalla configurazione delle chiavi esterne.


Blocco tabella

Oracle

Troncare richiede un blocco tabella esclusivo, l'eliminazione richiede un blocco tabella condiviso. Quindi disabilitare i blocchi di tabelle è un modo per impedire operazioni troncate su una tabella.


Trigger

I trigger DML non si attivano su un troncato.

Oracle

I trigger DDL sono disponibili.


Esecuzione remota

Oracle

Il troncamento non può essere emesso tramite un collegamento al database.


Colonne identità

SQL * Server

Troncare reimposta la sequenza per i tipi di colonna IDENTITY, l'eliminazione no.


Set di risultati

Nella maggior parte delle implementazioni, un'istruzione DELETE può restituire al client le righe che sono state eliminate.

es. in un sottoprogramma Oracle PL / SQL è possibile:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;

Altri suggerimenti

La differenza tra troncare ed eliminare è elencata di seguito:

+----------------------------------------+----------------------------------------------+
|                Truncate                |                    Delete                    |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing     | We can Rollback after delete.                |
| Truncate.                              |                                              |
|                                        |                                              |
| Example:                               | Example:                                     |
| BEGIN TRAN                             | BEGIN TRAN                                   |
| TRUNCATE TABLE tranTest                | DELETE FROM tranTest                         |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
| ROLLBACK                               | ROLLBACK                                     |
| SELECT * FROM tranTest                 | SELECT * FROM tranTest                       |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table.      | Delete does not reset identity of table.     |
+----------------------------------------+----------------------------------------------+
| It locks the entire table.             | It locks the table row.                      |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language)      | Its DML(Data Manipulation Language)          |
| command.                               | command.                                     |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it.     | We can use WHERE to filter data to delete.   |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate.   | Trigger is fired.                            |
+----------------------------------------+----------------------------------------------+
| Syntax :                               | Syntax :                                     |
| 1) TRUNCATE TABLE table_name           | 1) DELETE FROM table_name                    |
|                                        | 2) DELETE FROM table_name WHERE              |
|                                        |    example_column_id IN (1,2,3)              |
+----------------------------------------+----------------------------------------------+
  

GOCCIA

     

Il comando DROP rimuove una tabella dal database. Verranno inoltre rimosse tutte le righe, gli indici e i privilegi delle tabelle. Nessun trigger DML verrà attivato. L'operazione non può essere ripristinata.

     

TRUNCATE

     

TRUNCATE rimuove tutte le righe da una tabella. Non è possibile eseguire il rollback dell'operazione e non verranno attivati ??trigger. Pertanto, TRUCATE è più veloce e non utilizza lo spazio di annullamento di un DELETE.

     

Elimina

     

Il comando DELETE è usato per rimuovere le righe da una tabella. Una clausola WHERE può essere utilizzata per rimuovere solo alcune righe. Se non viene specificata alcuna condizione WHERE, tutte le righe verranno rimosse. Dopo aver eseguito un'operazione DELETE è necessario COMMIT o ROLLBACK la transazione per rendere permanente la modifica o annullarla. Nota che questa operazione farà scattare tutti i trigger DELETE sul tavolo.

Da: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

Tutte le risposte valide, a cui devo aggiungere:

Poiché TRUNCATE TABLE è un DDL ( Language Defination Data ) , non un DML ( Data Manipulation Langauge ), il comando Delete Triggers non eseguire.

Riepilogo di Elimina V Troncato in SQL Server
Per l'articolo completo segui questo link: http: // codaffection .com / sql-server-article / delete-vs-troncato-in-sql server /

 inserisci qui la descrizione dell'immagine

Tratto dall'articolo del mob dotnet: Elimina Vs Truncate in SQL Server

Con SQL Server o MySQL, se esiste un PK con incremento automatico, truncate ripristinerà il contatore.

" Truncate non registra nulla " è corretta. Andrei oltre:

Il troncamento non viene eseguito nel contesto di una transazione.

Il vantaggio di velocità del troncamento rispetto all'eliminazione dovrebbe essere evidente. Tale vantaggio varia da banale a enorme, a seconda della situazione.

Tuttavia, ho visto troncare rompere involontariamente l'integrità referenziale e violare altri vincoli. Il potere che ottieni modificando i dati al di fuori di una transazione deve essere bilanciato dalla responsabilità che erediti quando cammini sul filo del rasoio senza una rete.

Sì, DELETE è più lento, TRUNCATE è più veloce. Perché?

DELETE deve leggere i record, controllare i vincoli, aggiornare il blocco, aggiornare gli indici e generare ripetizione / annullamento. Tutto ciò richiede tempo.

TRUNCATE regola semplicemente un puntatore nel database per la tabella (High Water Mark) e poof! i dati sono spariti.

Questo è specifico di Oracle, AFAIK.

TRUNCATE è l'istruzione DDL mentre DELETE è un'istruzione DML. Di seguito sono riportate le differenze tra i due:

  1. Poiché TRUNCATE è un DDL ( Lingua definizione dati ) non richiede un commit per rendere permanenti le modifiche. E questo è il motivo per cui non è stato possibile eseguire il rollback delle righe eliminate da troncato. D'altra parte DELETE è un DML ( Linguaggio di manipolazione dei dati ) quindi è necessario un impegno esplicito per rendere permanente il suo effetto.

  2. TRUNCATE rimuove sempre tutte le righe da una tabella, lasciando la tabella vuota e la struttura della tabella intatta mentre DELETE può rimuovere in modo condizionale se viene utilizzata la clausola where .

  3. Le righe eliminate dall'istruzione TRUNCATE TABLE non possono essere ripristinate e non è possibile specificare la clausola where nell'istruzione TRUNCATE .

  4. Le istruzioni
  5. TRUNCATE non attivano i trigger invece del trigger di eliminazione sull'istruzione DELETE

Qui è l'ottimo link pertinente all'argomento.

Se accidentalmente hai rimosso tutti i dati dalla tabella usando Elimina / Tronca. È possibile eseguire il rollback della transazione impegnata. Ripristina l'ultimo backup ed esegui il registro delle transazioni fino al momento in cui Elimina / Tronca sta per verificarsi.

Le informazioni correlate di seguito sono tratte da un post sul blog :

  

Mentre lavoriamo sul database, stiamo usando Elimina e Tronca senza   conoscendo le differenze tra loro. In questo articolo discuteremo   la differenza tra Elimina e Tronca in Sql.

     

Elimina:

     
      
  • Elimina è un comando DML.
  •   
  • L'istruzione di eliminazione viene eseguita utilizzando un blocco di riga, ogni riga nella tabella viene bloccata per l'eliminazione.
  •   
  • Possiamo specificare i filtri nella clausola where.
  •   
  • Elimina i dati specificati se esiste la condizione.
  •   
  • Elimina le attività un trigger perché l'operazione viene registrata singolarmente.
  •   
  • Più lento di Troncato perché mantiene i registri
  •   
     

Tronca

     
      
  • Troncare è un comando DDL.
  •   
  • Troncare tabella blocca sempre la tabella e la pagina ma non ogni riga, poiché rimuove tutti i dati.
  •   
  • Impossibile utilizzare la condizione Where.
  •   
  • Rimuove tutti i dati.
  •   
  • La tabella di troncamento non può attivare un trigger poiché l'operazione non registra le singole eliminazioni di riga.
  •   
  • Più veloce in termini di prestazioni, perché non mantiene alcun registro.
  •   
     

Nota: Elimina e Troncare entrambi possono essere ripristinati quando utilizzati con   Transazione. Se la transazione viene eseguita, significa impegnata, quindi non possiamo   rollback Tronca il comando, ma possiamo ancora eseguire il rollback del comando Elimina   dai file di registro, poiché delete write li registra nel file di registro in caso affermativo   necessario eseguire il rollback in futuro dai file di registro.

     

Se hai un vincolo di chiave esterna che fa riferimento alla tabella che sei   cercando di troncare, questo non funzionerà anche se la tabella di riferimento non ha   dati in esso. Questo perché il controllo della chiave esterna viene eseguito con DDL   piuttosto che DML. Questo può essere risolto disabilitando temporaneamente il file   vincolo / i di chiave esterna alla tabella.

     

Elimina tabella è un'operazione registrata. Quindi viene eliminata ogni riga   registrato nel registro delle transazioni, il che rende lento. Tronca tabella   elimina anche tutte le righe in una tabella, ma non registrerà la cancellazione di   ogni riga invece registra la deallocazione delle pagine di dati di   tabella, che lo rende più veloce.

     

~ Se accidentalmente hai rimosso tutti i dati dalla tabella usando   Cancellare / Tronca. È possibile eseguire il rollback della transazione impegnata. Ripristina il   ultimo backup ed eseguire il registro delle transazioni fino al momento in cui Elimina / Tronca   sta per succedere.

In SQL Server 2005 credo che puoi eseguire il rollback di un troncato

TRUNCATE può essere ripristinato se inserito in una transazione.

Consulta i due riferimenti seguenti e mettiti alla prova: -

http://blog.sqlauthority.com/2007/12/26/sql-server-truncate-cant-be-rolled-back-using-log-files-after-transaction -session-is-closed /

http://sqlblog.com/blogs/kalen_delaney/archive/2010/10/12/tsql-tuesday-11-rolling-back-truncate-table.aspx

TRUNCATE vs. DELETE è una delle famigerate domande durante le interviste SQL. Assicurati solo di spiegarlo correttamente all'intervistatore o potrebbe costarti il ??lavoro. Il problema è che non molti sono a conoscenza, quindi molto probabilmente considereranno la risposta sbagliata se dici loro che SI Truncate può essere ripristinato.

  

Elimina

     

Il comando DELETE è usato per rimuovere le righe da una tabella. Una clausola WHERE può essere utilizzata per rimuovere solo alcune righe. Se non viene specificata alcuna condizione WHERE, tutte le righe verranno rimosse. Dopo aver eseguito un'operazione DELETE è necessario COMMIT o ROLLBACK la transazione per rendere permanente la modifica o annullarla. Nota che questa operazione farà scattare tutti i trigger DELETE sul tavolo.

     

TRUNCATE

     

TRUNCATE rimuove tutte le righe da una tabella. Non è possibile eseguire il rollback dell'operazione e non verranno attivati ??trigger. Pertanto, TRUCATE è più veloce e non utilizza lo spazio di annullamento di un DELETE.

     

GOCCIA

     

Il comando DROP rimuove una tabella dal database. Verranno inoltre rimosse tutte le righe, gli indici e i privilegi delle tabelle. Nessun trigger DML verrà attivato. L'operazione non può essere ripristinata.

     
     

DROP e TRUNCATE sono comandi DDL, mentre DELETE è un comando DML. Pertanto le operazioni DELETE possono essere ripristinate (annullate), mentre le operazioni DROP e TRUNCATE non possono essere ripristinate.

Da: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

Una piccola correzione alla risposta originale - delete genera anche quantità significative di ripetizione (poiché l'annullamento è esso stesso protetto da ripetizione). Questo può essere visto dall'output di autotrace:

SQL> delete from t1;

10918 rows deleted.

Elapsed: 00:00:00.58

Execution Plan
----------------------------------------------------------
   0      DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
   1    0   DELETE OF 'T1'
   2    1     TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)




Statistics
----------------------------------------------------------
         30  recursive calls
      12118  db block gets
        213  consistent gets
        142  physical reads
    3975328  redo size
        441  bytes sent via SQL*Net to client
        537  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      10918  rows processed

Ecco la mia risposta dettagliata su la differenza tra DELETE e TRUNCATE in SQL Server

Rimuovi dati : per prima cosa, entrambi possono essere utilizzati per rimuovere le righe dalla tabella.
Ma un DELETE può essere usato per rimuovere le righe non solo da una tabella ma anche da una VIEW o dal risultato di OPENROWSET o OPENQUERY in base alle funzionalità del provider.

Clausola FROM : con DELETE puoi anche eliminare le righe da una tabella / view /owset_function_limited in base alle righe di un'altra tabella utilizzando un'altra clausola FROM. In quella clausola FROM puoi anche scrivere le normali condizioni JOIN. In realtà puoi creare un'istruzione DELETE da un'istruzione SELECT che non contiene alcuna funzione aggregata sostituendo SELECT con DELETE e rimuovendo i nomi di colonna.
Con TRUNCATE non puoi farlo.

DOVE : un TRUNCATE non può avere condizioni WHERE, ma un ELIMINA può. Ciò significa che con TRUNCATE non è possibile eliminare una riga specifica o un gruppo specifico di righe. TRUNCATE TABLE è simile all'istruzione DELETE senza clausola WHERE.

Rendimento : TRUNCATE TABLE è più veloce e utilizza meno risorse del sistema e del registro delle transazioni. E uno dei motivi sono i blocchi utilizzati da entrambe le istruzioni. L'istruzione DELETE viene eseguita utilizzando un blocco di riga, ogni riga nella tabella viene bloccata per l'eliminazione. TRUNCATE TABLE blocca sempre la tabella e la pagina ma non ogni riga.

Registro delle transazioni : l'istruzione DELETE rimuove le righe una alla volta e crea singole voci nel registro delle transazioni per ogni riga.
TRUNCATE TABLE rimuove i dati deallocando le pagine di dati utilizzate per archiviare i dati della tabella e registra solo le deallocazioni di pagine nel registro delle transazioni.

Pagine : dopo l'esecuzione di un'istruzione DELETE, la tabella può ancora contenere pagine vuote. TRUNCATE rimuove i dati deallocando le pagine di dati utilizzate per memorizzare i dati della tabella.

Trigger : TRUNCATE non attiva i trigger di eliminazione sulla tabella. Quindi devi stare molto attento durante l'utilizzo di TRUNCATE. Non si dovrebbe mai usare un TRUNCATE se il trigger di eliminazione è definito nella tabella per eseguire una pulizia automatica o un'azione di registrazione quando le righe vengono eliminate.

Colonna identità : con TRUNCATE se la tabella contiene una colonna identità, il contatore per quella colonna viene ripristinato sul valore seed definito per la colonna. Se non è stato definito alcun seme, viene utilizzato il valore predefinito 1. DELETE non reimposta il contatore di identità. Quindi, se vuoi conservare il contatore di identità, usa invece DELETE.

Replica : DELETE può essere utilizzato contro la tabella utilizzata nella replica transazionale o nella replica di tipo merge.
Mentre TRUNCATE non può essere utilizzato contro le tabelle coinvolte nella replica transazionale o nella replica di tipo merge.

Rollback : è possibile eseguire il rollback dell'istruzione DELETE.
TRUNCATE può anche essere ripristinato a condizione che sia racchiuso in un blocco TRANSAZIONE e che la sessione non sia chiusa. Una volta chiusa la sessione non sarà possibile eseguire il rollback di TRUNCATE.

Restrizioni : l'istruzione DELETE potrebbe non riuscire se viola un trigger o tenta di rimuovere una riga a cui fanno riferimento i dati in un'altra tabella con un vincolo FOREIGN KEY. Se DELETE rimuove più righe e una delle righe rimosse viola un trigger o un vincolo, l'istruzione viene annullata, viene restituito un errore e nessuna riga viene rimossa.
E se DELETE viene utilizzato su Visualizza, tale vista deve essere una vista aggiornabile. TRUNCATE non può essere utilizzato contro la tabella utilizzata nella vista indicizzata.
TRUNCATE non può essere utilizzato contro la tabella a cui fa riferimento un vincolo FOREIGN KEY, a meno che una tabella che abbia una chiave esterna che faccia riferimento a se stessa.

La differenza più grande è che troncare è un'operazione non registrata mentre l'eliminazione è.

Semplicemente significa che in caso di arresto anomalo del database, non è possibile ripristinare i dati operati da troncato ma con l'eliminazione è possibile.

Maggiori dettagli qui

Istruzione DELETE: questo comando elimina solo le righe dalla tabella in base alla condizione indicata nella clausola where o elimina tutte le righe dalla tabella se non viene specificata alcuna condizione. Ma non libera lo spazio contenente la tabella.

La sintassi di un'istruzione DELETE SQL è:

DELETE FROM table_name [condizione WHERE];

Istruzione TRUNCATE: questo comando viene utilizzato per eliminare tutte le righe dalla tabella e liberare lo spazio contenente la tabella.

Elimina

DELETE is a DML command
DELETE you can rollback
Delete = Only Delete- so it can be rolled back
In DELETE you can write conditions using WHERE clause
Syntax – Delete from [Table] where [Condition]

TRUNCATE

TRUNCATE is a DDL command
You can't rollback in TRUNCATE, TRUNCATE removes the record permanently
Truncate = Delete+Commit -so we can't roll back
You can't use conditions(WHERE clause) in TRUNCATE
Syntax – Truncate table [Table]

Per maggiori dettagli visita

http://www.zilckh.com / cosa-è-il-differenza-tra-troncare-and-delete /

Un'ulteriore differenza delle due operazioni è che se la tabella contiene una colonna identità, il contatore per quella colonna viene resettato 1 (o al valore seed definito per la colonna) in TRUNCATE. DELETE non ha questo effetto.

In breve, il troncamento non registra nulla (quindi è molto più veloce ma non può essere annullato) mentre l'eliminazione è registrata (e può far parte di una transazione più grande, eseguirà il rollback ecc.). Se hai dati che non vuoi in una tabella in dev è normalmente meglio troncare poiché non corri il rischio di riempire il registro delle transazioni

Un grande motivo per cui è utile è quando è necessario aggiornare i dati in una tabella con più milioni di righe, ma non si desidera ricostruirla. " Elimina * " richiederebbe un'eternità, mentre l'impatto sulle prestazioni di Truncate sarebbe trascurabile.

Impossibile eseguire DDL su un doppio lampeggio.

Vorrei commentare il post di matthieu, ma non ho ancora il rappresentante ...

In MySQL, il contatore di incremento automatico viene ripristinato con troncato, ma non con eliminazione.

Non è che troncato non registri nulla in SQL Server. truncate non registra alcuna informazione ma registra la deallocazione della pagina di dati per la tabella su cui è stato attivato TRUNCATE.

e il record troncato possono essere rollback se definiamo la transazione all'inizio e possiamo ripristinare il record troncato dopo il rollback. Ma non è possibile recuperare i record troncati dal backup del registro delle transazioni dopo la transazione troncata impegnata.

Troncare può anche essere ripristinato qui nell'esempio

begin Tran
delete from  Employee

select * from Employee
Rollback
select * from Employee

Troncare ed eliminare in SQL sono due comandi utilizzati per rimuovere o eliminare i dati dalla tabella. Sebbene di natura abbastanza basilare, entrambi i comandi Sql possono creare molti problemi fino a quando non si ha familiarità con i dettagli prima di usarlo. Una scelta errata del comando può comportare un processo molto lento o addirittura l'espansione del segmento di registro, se è necessario rimuovere troppi dati e il segmento di registro non è sufficiente. Ecco perché è fondamentale sapere quando utilizzare il comando truncate ed delete in SQL, ma prima di utilizzarli dovresti essere consapevole delle differenze tra Truncate ed Delete e, in base a esse, dovremmo essere in grado di scoprire quando DELETE è l'opzione migliore per rimuovere dati o TRUNCATE dovrebbero essere usati per eliminare le tabelle.

Controlla controllo fai clic qui

Emettendo un'istruzione TRUNCATE TABLE, si indica a SQL Server di eliminare tutti i record all'interno di una tabella, senza che si verifichi alcuna registrazione o elaborazione delle transazioni.

L'istruzione DELETE può avere una clausola WHERE per eliminare record specifici mentre l'istruzione TRUNCATE non ne richiede alcuna e cancella l'intera tabella. È importante sottolineare che l'istruzione DELETE registra la data eliminata mentre l'istruzione TRUNCATE no.

Un'altra differenza specifica per microsoft sql server è con delete è possibile utilizzare l'istruzione output per tenere traccia di quali record sono stati eliminati, ad es .:

delete from [SomeTable]
output deleted.Id, deleted.Name

Non puoi farlo con troncare .

Il comando

Troncare viene utilizzato per reinizializzare la tabella, è un comando DDL che elimina tutte le righe della tabella. ELIMINA è un comando DML utilizzato per eliminare una riga o un insieme di righe in base a una condizione, se la condizione non è specificata, questo comando eliminerà tutte le righe dalla tabella.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top