Converti PostgreSQL in MariaDB
Trascina un dump plain di pg_dump o pg_dumpall, come .sql o .sql.gz, e scarica uno script per MariaDB con le stesse tabelle, chiavi, indici e dati. Ogni valore che MariaDB non può contenere così com'è, e ogni oggetto che non supporta, è elencato nel report.
18 righe convertite, 3 correzioni, nessuna rifiutata
Tabelle in shop_2024_postgres.sqlDump PostgreSQL 18.6 · scritto da pg_dump · utf8mb4
customers8 righe2
8 colonne id int not null name text not null email varchar(768) not null country char(2) not null is_active tinyint(1) not null tags json not null signed_up date created_at datetime(6) not null orders10 righe1
10 colonne id int not null customer_id int not null status enum('pending','paid','shipped','cancelled') not null total decimal(10,2) not null items smallint not null ordered_at datetime(6) not null shipped_at datetime(6) note text details json delivery varchar(100)
Non convertiti
- Vista paid_orders
Ogni database li scrive nel proprio linguaggio. Riscrivili per MariaDB.
-- Written by IntoSQL from a PostgreSQL dump. Load it with: mariadb --default-character-set=utf8mb4 <database> < <file>
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES';
CREATE TABLE `customers` (
`id` int NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`email` varchar(768) NOT NULL,
`country` char(2) NOT NULL DEFAULT 'US',
`is_active` tinyint(1) NOT NULL DEFAULT 1,
`tags` json NOT NULL,
`signed_up` date,
`created_at` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
UNIQUE KEY `customers_email_key` (`email`),
PRIMARY KEY (`id`)
) AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='People who bought at least once';
CREATE TABLE `orders` (
`id` int NOT NULL AUTO_INCREMENT,
`customer_id` int NOT NULL,
`status` enum('pending','paid','shipped','cancelled') NOT NULL DEFAULT 'pending',
`total` decimal(10,2) NOT NULL,
`items` smallint NOT NULL DEFAULT 1,
`ordered_at` datetime(6) NOT NULL,
`shipped_at` datetime(6),
`note` text,
`details` json,
`delivery` varchar(100),
PRIMARY KEY (`id`),
KEY `idx_orders_customer` (`customer_id`),
KEY `idx_orders_status_date` (`status`,`ordered_at`),
CONSTRAINT `orders_total_check` CHECK (`total` >= (0)),
CONSTRAINT `orders_customer_id_fkey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) AUTO_INCREMENT=5001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
INSERT INTO `customers` (`id`,`name`,`email`,`country`,`is_active`,`tags`,`signed_up`,`created_at`) VALUES (1,'Ana Martínez','ana@example.com','MX',1,'["vip"]','2023-01-15','2023-01-15 10:24:00'),(2,'Zoë Müller','zoe@example.de','DE',1,'[]','2023-02-03','2023-02-03 08:11:42'),(3,'José Peña','jose@example.es','ES',0,'["wholesale","late payer"]','2023-03-21','2023-03-21 19:05:17'),(4,'李雷','lilei@example.cn','CN',1,'[]','2023-05-09','2023-05-09 02:40:00'),(5,'Noah O\'Brien','noah@example.ie','IE',1,'[]',NULL,'2023-06-30 14:00:00'),(6,'Amélie Laurent','amelie@example.fr','FR',1,'["vip"]','2024-01-02','2024-01-02 09:30:00'),(7,'Ravi Patel','ravi@example.in','IN',0,'[]','2024-02-29','2024-02-29 23:59:59'),(8,'Sofia Rossi 🌻','sofia@example.it','IT',1,'[]','2024-04-12','2024-04-12 12:12:12');
INSERT INTO `orders` (`id`,`customer_id`,`status`,`total`,`items`,`ordered_at`,`shipped_at`,`note`,`details`,`delivery`) VALUES (1,1,'shipped',129.90,3,'2024-03-01 10:00:00','2024-03-02 16:30:00',NULL,'{"gift": false}','1 day 06:30:00'),(2,2,'paid',54.00,1,'2024-03-02 11:15:00',NULL,'Gift wrap 🎁','{"gift": true, "wrap": "red"}',NULL),(3,1,'cancelled',12.50,1,'2024-03-03 09:45:00',NULL,'Customer changed their mind',NULL,NULL),(4,4,'shipped',980.00,12,'2024-03-05 02:10:00','2024-03-07 08:00:00','请小心轻放','{"fragile": true}','2 days 05:50:00'),(5,5,'pending',45.75,2,'2024-03-08 17:20:00',NULL,'Leave at the door; ring twice',NULL,NULL),(6,6,'shipped',310.40,5,'2024-03-10 13:00:00','2024-03-11 09:00:00','Fragile: "glass"','{"fragile": true}','20:00:00'),(7,8,'paid',76.20,2,'2024-03-11 18:45:00',NULL,NULL,NULL,NULL),(8,2,'shipped',19.99,1,'2024-03-12 08:00:00',NULL,'Shipped date set to infinity by an old import',NULL,NULL),(9,3,'shipped',64.00,2,'2024-03-14 15:30:00','2024-03-15 10:00:00','Two parcels','{"parcels": [1, 2]}','18:30:00'),(10,7,'paid',1499.00,1,'2024-03-15 21:05:00',NULL,'C:\\Users\\ravi\\invoice.pdf',NULL,NULL);
SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
Correzioni
- "created_at" di customers contiene istanti con fuso orario; MariaDB non ha un tipo che lo conservi, quindi sono salvati in UTC come datetime(6).
- "tags" di customers è text[], che MariaDB non ha, quindi è json con gli stessi valori.
- "delivery" di orders è interval, che MariaDB non ha, quindi è varchar(100) con gli stessi valori.
Da controllare
- 1 vista, trigger, routine o evento non è convertito; il report li elenca uno per uno. Ricreali a mano in MariaDB.
- Il valore predefinito di "tags" in customers non si può scrivere per MariaDB (a value its type can't hold), quindi la colonna non ha un valore predefinito. Aggiungi a mano il valore predefinito se le nuove righe ne hanno bisogno.
- L'indice idx_orders_details su orders usa un'espressione che non si può scrivere per MariaDB (neither MySQL 5.7 nor MariaDB index an expression), quindi non viene creato. Crea l'indice a mano se le query ne hanno bisogno.
- 1 valore in "shipped_at" di orders è una data che MariaDB non può salvare, come infinity, quindi è NULL. MariaDB salva gli anni dall'1 al 9999 senza infinito; sostituisci quelle date nella sorgente se contano.
Il tuo file viene convertito su questo computer e non viene mai caricato.
Altri esempi:
Cosa cambia da PostgreSQL a MariaDB
Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.
boolean
tinyint(1)
Il BOOLEAN di MariaDB è TINYINT(1): true è 1 e false è 0.
varchar(n), char(n), text
varchar(n) fino a 1024 caratteri, char(n) fino a 255, text oltre
Il testo mantiene ogni carattere come utf8mb4. Una colonna in una chiave è al massimo varchar(768), il massimo che una chiave contiene.
numeric(p,s) past 65 digits or 30 decimals, and numeric values past what decimal(65,30) holds
varchar
Il decimal di MariaDB contiene 65 cifre con 30 decimali. I numeri più ampi restano testo così ogni cifra resta esatta; numeric senza precisione è decimal(65,30) quando i valori ci stanno.
Riga del report: decimal_as_text
money
decimal(19,2)
MariaDB non ha un tipo money. L'importo resta un numero, senza il simbolo di valuta aggiunto dal locale del server.
Riga del report: type_replaced
interval
varchar(100) con il testo di PostgreSQL
Il TIME di MariaDB contiene durate fino a 838 ore, ma un interval ha mesi e giorni; il suo testo mantiene ogni parte.
Riga del report: type_replaced
arrays (integer[], text[]...)
array json
MariaDB non ha array. Un array JSON mantiene ogni elemento e i NULL, e le funzioni JSON lo leggono.
Riga del report: type_replaced
ranges, geometric types, tsvector, xml, hstore, composite and extension types
longtext con il testo di PostgreSQL
MariaDB non ha un tipo equivalente, quindi ogni valore mantiene il testo scritto da PostgreSQL.
Riga del report: type_replaced
json, jsonb
json
Gli stessi valori JSON; l'ordine delle chiavi e gli spazi di jsonb sono quelli del server.
timestamp
datetime(p)
Un timestamp senza fuso orario è l'ora letta su un orologio, come datetime.
timestamp with time zone
datetime(p) in UTC
Il TIMESTAMP di MariaDB arriva solo al 2038, quindi gli istanti sono salvati come datetime in UTC, lo stesso istante qualunque offset abbia scritto il dump.
Riga del report: moments_as_utc
time
time(p)
Il TIME di MariaDB contiene ogni ora del giorno, 24:00:00 inclusa.
infinity, -infinity, BC dates and years past 9999
NULL
MariaDB salva gli anni dal 1000 al 9999 senza infinito. Quei valori diventano NULL e il report li conta.
Riga del report: date_out_of_range
NaN and Infinity in numeric, real and double precision
NULL
I numeri di MariaDB non hanno NaN né Infinity, quindi quei valori diventano NULL e il report li conta.
Riga del report: invalid_value_null
NOT NULL columns with values that become NULL
NOT NULL rimosso
Una colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.
Riga del report: not_null_relaxed
enum types
enum(...) con le stesse etichette
L'ENUM di MariaDB mantiene le etichette nel loro ordine.
uuid, inet, cidr
uuid come uuid, inet e cidr come varchar(43)
MariaDB ha un tipo uuid; gli indirizzi mantengono il loro testo, maschera inclusa.
bytea
blob, mediumblob o longblob; varbinary(3072) in una chiave
I byte restano byte.
bit(n)
bit(n) fino a 64, testo oltre
Una stringa di bit fino a 64 bit è il numero formato dai suoi bit; una più lunga mantiene le sue cifre.
citext and nondeterministic collations
confronto esatto
Le tabelle usano utf8mb4_bin così il testo si confronta in modo esatto, come in PostgreSQL; le colonne che ignoravano le maiuscole nella sorgente lo perdono.
Riga del report: case_insensitive_collation
serial, identity
AUTO_INCREMENT, che riparte dopo l'id più alto
Conta la colonna che apre la chiave primaria; il contatore riparte da dove era la sequenza.
a second serial or identity column in a table
intero semplice
MariaDB conta una colonna per tabella; ogni altra mantiene i suoi valori senza contatore.
Riga del report: counter_dropped
sequences not owned by a column
CREATE SEQUENCE, al valore che assegnerà dopo
Le sequenze di MariaDB funzionano allo stesso modo.
generated columns
colonne generate, STORED come nella sorgente
MariaDB le calcola allo stesso modo.
generated columns with functions MariaDB lacks
una colonna semplice
Una formula che non si può scrivere per MariaDB lascia una colonna semplice e una riga nel report.
Riga del report: generated_not_translated
defaults with functions MariaDB lacks, and defaults from a sequence
nessun valore predefinito
Un valore predefinito che non si può scrivere per MariaDB viene omesso e segnalato.
Riga del report: default_not_translated
CHECK constraints
tradotti, dentro CREATE TABLE
MySQL 8.0.16 e MariaDB li applicano; MySQL 5.7 li mantiene senza verificarli.
CHECK constraints with functions MariaDB lacks
non creato
Un vincolo CHECK che non si può scrivere per MariaDB viene omesso e segnalato.
Riga del report: check_skipped
CHECK ... NOT VALID
non creato
PostgreSQL non ha mai verificato le righe che c'erano prima, quindi potrebbero violarlo.
Riga del report: check_not_valid
gin, gist, brin and hash indexes, partial and expression indexes
non creato
MariaDB ha solo indici b-tree, full-text e spaziali, su colonne intere, senza WHERE.
Riga del report: index_skipped
foreign keys
chiavi esterne, caricate con FOREIGN_KEY_CHECKS=0
Le righe si caricano in qualsiasi ordine, e le chiavi verificano le nuove righe dopo.
foreign keys to tables the dump doesn't create
non creato
Una chiave non può riferirsi a una tabella che non c'è.
Riga del report: foreign_key_skipped
partitioned tables
una tabella con le righe di ogni partizione
Le righe sono le stesse; partiziona di nuovo la tabella in MariaDB se serve.
Riga del report: partitions_dropped
schemas
un database, tabelle con il nome del loro schema davanti
Gli schemi di MariaDB sono database, che uno script caricato in un solo database non può creare; le tabelle in public mantengono il loro nome.
Riga del report: schemas_merged
views, functions, procedures, triggers, rules, policies, extensions and types
elencati nel report
Il loro codice è scritto nel linguaggio di PostgreSQL, quindi vengono elencati perché tu li ricrei.
Riga del report: not_converted_objects
dumps without CREATE TABLE (--data-only)
tipi ricavati dai valori
Un dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.
Riga del report: no_schema
expressions in INSERT values
NULL
Un convertitore che non esegue un database non può valutarle.
Riga del report: expression_value
types IntoSQL doesn't know
longtext
Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.
Riga del report: unknown_type
text that isn't valid in its encoding
i byte errati come carattere di sostituzione
Il testo deve essere utf8mb4 valido.
Riga del report: invalid_utf8_replaced
text decoded twice (ñ)
copiato così com'è
Il dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.
Riga del report: mojibake_suspected
| In PostgreSQL | In MariaDB | Riga del report |
|---|---|---|
| boolean | tinyint(1)Il BOOLEAN di MariaDB è TINYINT(1): true è 1 e false è 0. | |
| varchar(n), char(n), text | varchar(n) fino a 1024 caratteri, char(n) fino a 255, text oltreIl testo mantiene ogni carattere come utf8mb4. Una colonna in una chiave è al massimo varchar(768), il massimo che una chiave contiene. | |
| numeric(p,s) past 65 digits or 30 decimals, and numeric values past what decimal(65,30) holds | varcharIl decimal di MariaDB contiene 65 cifre con 30 decimali. I numeri più ampi restano testo così ogni cifra resta esatta; numeric senza precisione è decimal(65,30) quando i valori ci stanno. | decimal_as_text |
| money | decimal(19,2)MariaDB non ha un tipo money. L'importo resta un numero, senza il simbolo di valuta aggiunto dal locale del server. | type_replaced |
| interval | varchar(100) con il testo di PostgreSQLIl TIME di MariaDB contiene durate fino a 838 ore, ma un interval ha mesi e giorni; il suo testo mantiene ogni parte. | type_replaced |
| arrays (integer[], text[]...) | array jsonMariaDB non ha array. Un array JSON mantiene ogni elemento e i NULL, e le funzioni JSON lo leggono. | type_replaced |
| ranges, geometric types, tsvector, xml, hstore, composite and extension types | longtext con il testo di PostgreSQLMariaDB non ha un tipo equivalente, quindi ogni valore mantiene il testo scritto da PostgreSQL. | type_replaced |
| json, jsonb | jsonGli stessi valori JSON; l'ordine delle chiavi e gli spazi di jsonb sono quelli del server. | |
| timestamp | datetime(p)Un timestamp senza fuso orario è l'ora letta su un orologio, come datetime. | |
| timestamp with time zone | datetime(p) in UTCIl TIMESTAMP di MariaDB arriva solo al 2038, quindi gli istanti sono salvati come datetime in UTC, lo stesso istante qualunque offset abbia scritto il dump. | moments_as_utc |
| time | time(p)Il TIME di MariaDB contiene ogni ora del giorno, 24:00:00 inclusa. | |
| infinity, -infinity, BC dates and years past 9999 | NULLMariaDB salva gli anni dal 1000 al 9999 senza infinito. Quei valori diventano NULL e il report li conta. | date_out_of_range |
| NaN and Infinity in numeric, real and double precision | NULLI numeri di MariaDB non hanno NaN né Infinity, quindi quei valori diventano NULL e il report li conta. | invalid_value_null |
| NOT NULL columns with values that become NULL | NOT NULL rimossoUna colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe. | not_null_relaxed |
| enum types | enum(...) con le stesse etichetteL'ENUM di MariaDB mantiene le etichette nel loro ordine. | |
| uuid, inet, cidr | uuid come uuid, inet e cidr come varchar(43)MariaDB ha un tipo uuid; gli indirizzi mantengono il loro testo, maschera inclusa. | |
| bytea | blob, mediumblob o longblob; varbinary(3072) in una chiaveI byte restano byte. | |
| bit(n) | bit(n) fino a 64, testo oltreUna stringa di bit fino a 64 bit è il numero formato dai suoi bit; una più lunga mantiene le sue cifre. | |
| citext and nondeterministic collations | confronto esattoLe tabelle usano utf8mb4_bin così il testo si confronta in modo esatto, come in PostgreSQL; le colonne che ignoravano le maiuscole nella sorgente lo perdono. | case_insensitive_collation |
| serial, identity | AUTO_INCREMENT, che riparte dopo l'id più altoConta la colonna che apre la chiave primaria; il contatore riparte da dove era la sequenza. | |
| a second serial or identity column in a table | intero sempliceMariaDB conta una colonna per tabella; ogni altra mantiene i suoi valori senza contatore. | counter_dropped |
| sequences not owned by a column | CREATE SEQUENCE, al valore che assegnerà dopoLe sequenze di MariaDB funzionano allo stesso modo. | |
| generated columns | colonne generate, STORED come nella sorgenteMariaDB le calcola allo stesso modo. | |
| generated columns with functions MariaDB lacks | una colonna sempliceUna formula che non si può scrivere per MariaDB lascia una colonna semplice e una riga nel report. | generated_not_translated |
| defaults with functions MariaDB lacks, and defaults from a sequence | nessun valore predefinitoUn valore predefinito che non si può scrivere per MariaDB viene omesso e segnalato. | default_not_translated |
| CHECK constraints | tradotti, dentro CREATE TABLEMySQL 8.0.16 e MariaDB li applicano; MySQL 5.7 li mantiene senza verificarli. | |
| CHECK constraints with functions MariaDB lacks | non creatoUn vincolo CHECK che non si può scrivere per MariaDB viene omesso e segnalato. | check_skipped |
| CHECK ... NOT VALID | non creatoPostgreSQL non ha mai verificato le righe che c'erano prima, quindi potrebbero violarlo. | check_not_valid |
| gin, gist, brin and hash indexes, partial and expression indexes | non creatoMariaDB ha solo indici b-tree, full-text e spaziali, su colonne intere, senza WHERE. | index_skipped |
| foreign keys | chiavi esterne, caricate con FOREIGN_KEY_CHECKS=0Le righe si caricano in qualsiasi ordine, e le chiavi verificano le nuove righe dopo. | |
| foreign keys to tables the dump doesn't create | non creatoUna chiave non può riferirsi a una tabella che non c'è. | foreign_key_skipped |
| partitioned tables | una tabella con le righe di ogni partizioneLe righe sono le stesse; partiziona di nuovo la tabella in MariaDB se serve. | partitions_dropped |
| schemas | un database, tabelle con il nome del loro schema davantiGli schemi di MariaDB sono database, che uno script caricato in un solo database non può creare; le tabelle in public mantengono il loro nome. | schemas_merged |
| views, functions, procedures, triggers, rules, policies, extensions and types | elencati nel reportIl loro codice è scritto nel linguaggio di PostgreSQL, quindi vengono elencati perché tu li ricrei. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | tipi ricavati dai valoriUn dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori. | no_schema |
| expressions in INSERT values | NULLUn convertitore che non esegue un database non può valutarle. | expression_value |
| types IntoSQL doesn't know | longtextIl testo contiene qualsiasi valore; cambia il tipo dopo il caricamento. | unknown_type |
| text that isn't valid in its encoding | i byte errati come carattere di sostituzioneIl testo deve essere utf8mb4 valido. | invalid_utf8_replaced |
| text decoded twice (ñ) | copiato così com'èIl dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala. | mojibake_suspected |
Carica lo script in MariaDB
Lo script crea le tabelle, copia le righe, poi aggiunge chiavi, indici e chiavi esterne, così si carica in fretta e si ferma al primo errore.
mariadb --default-character-set=utf8mb4 mydb < postgresql.mariadb.sqlLe chiavi esterne vengono create come le dichiara il dump, con FOREIGN_KEY_CHECKS=0 mentre le righe si caricano, come fa mysqldump.
Per un dump grande, esegui il client sulla stessa macchina del server, e aumenta max_allowed_packet se una singola riga è molto grande.
IntoSQL Pro carica il file direttamente in MariaDB dall'app desktop o dalla riga di comando, senza scrivere uno script.
Fai il dump di PostgreSQL per il miglior risultato
Il convertitore legge ciò che il dump contiene. Con queste opzioni il dump conserva più dei tuoi dati:
- --format=plain, il default di pg_dump, scrive SQL. Un archivio custom o directory (-Fc, -Fd) diventa SQL con pg_restore -f dump.sql, senza un server di database.
- --no-owner --no-privileges escludono ruoli e permessi, che il convertitore comunque salta, così il dump è più piccolo.
- pg_dumpall esporta ogni database in un solo file; le tabelle di ognuno hanno il suo nome davanti, così niente entra in conflitto.
Cosa non viene convertito
Viste, viste materializzate, funzioni, procedure, trigger, regole, policy di sicurezza a livello di riga, estensioni e tipi sono scritti nel linguaggio di PostgreSQL. Sono elencati per nome nel report, mai rimossi in silenzio, così puoi riscriverli per MariaDB.
Domande sulla conversione da PostgreSQL a MariaDB
Non trovi la risposta? Scrivici dalla pagina dei contatti e ti risponde una persona. Pagina dei contatti
Il mio dump viene caricato?
No. Il convertitore funziona nel tuo browser e legge il dump dal tuo disco a pezzi, quindi non lascia mai il tuo computer. Anche l'app desktop e la riga di comando convertono sul tuo computer.
Quanto può essere grande il dump?
Il convertitore non tiene mai l'intero dump in memoria: legge il file due volte, per intervalli, e scrive lo script man mano. I dump di più gigabyte si convertono nel browser, nell'app desktop e con la riga di comando.
Legge gli archivi pg_dump -Fc?
Non direttamente: un archivio custom è un formato binario. pg_restore -f dump.sql dump.backup lo trasforma nel SQL plain che il convertitore legge, senza connettersi a un server. Il convertitore lo dice quando riceve un archivio.
Da quali versioni di PostgreSQL può provenire il dump?
Dump scritti da pg_dump e pg_dumpall da PostgreSQL 10 in poi, con righe COPY o INSERT. Ogni dump di test viene da PostgreSQL 13 e 18 ed è confrontato con la sorgente cella per cella.
I valori serial e identity vengono mantenuti?
Sì, per una colonna per tabella: la colonna serial o identity che apre la chiave primaria diventa AUTO_INCREMENT e riparte dopo l'id più alto. Le sequenze non legate a una colonna diventano sequenze di MariaDB al valore raggiunto.
Cosa succede ad array, enum e altri tipi di PostgreSQL?
Gli array diventano array JSON, i booleani tinyint(1), gli enum ENUM con le stesse etichette, uuid UUID e money un decimal. Range, tipi geometrici, hstore e tipi composti mantengono il testo di PostgreSQL, e il report dice quali colonne.
E funzioni, trigger e viste?
Sono elencati per nome nel report e non vengono convertiti, perché ogni database li scrive nel proprio linguaggio.
Su quali versioni di MariaDB si carica lo script?
MariaDB 10.11 e successive. Ogni dump di test si carica su 10.11 e 11.4, fermandosi al primo errore se qualcosa va storto.