SQLite INSERISCI, AGGIORNA, ELIMINA Interrogazione con esempio

⚡ Riepilogo intelligente

SQLite Le istruzioni INSERT, UPDATE e DELETE modificano i dati in un database aggiungendo nuove righe, modificando i valori esistenti e rimuovendo record, mentre la clausola ON CONFLICT decide come vengono risolte le violazioni dei vincoli durante tali operazioni.

  • 📝 INSERIRE: L'istruzione INSERT aggiunge una o più nuove righe, specificando le colonne di destinazione e i relativi valori tramite la clausola VALUES.
  • AGGIORNARE: L'istruzione UPDATE modifica i valori esistenti delle colonne, utilizzando SET per i nuovi dati e WHERE per specificare righe specifiche.
  • 🗑️ ELIMINA: L'istruzione DELETE rimuove le righe che corrispondono a una condizione WHERE, oppure tutte le righe quando la clausola WHERE viene omessa.
  • ⚠️ Clausola di conflitto: La clausola ON CONFLICT risolve le violazioni dei vincoli tramite ROLLBACK, ABORT, FAIL, IGNORE o REPLACE.
  • 🔁 Le operazioni: Una transazione di database raggruppa diverse operazioni in un'unica unità che può essere confermata o annullata completamente.
  • 🤖 Assistenza AI: Gli strumenti di intelligenza artificiale per la conversione da testo a SQL e GitHub Copilot generano SQLite Eseguire istruzioni INSERT, UPDATE e DELETE tramite prompt in linguaggio naturale.

SQLite INSERISCI, AGGIORNA, ELIMINA Interrogazione

Query di inserimento, aggiornamento ed eliminazione in SQLite

Le clausole di modifica dei dati in SQLite sono istruzioni INSERT, UPDATE e DELETE. Viene utilizzato per inserire nuove righe, aggiornare valori esistenti o eliminare righe dal database.

Si noti che, per tutti gli esempi seguenti, è necessario eseguire sqlite3.exe e aprire una connessione al database di esempio come segue:

Passo 1) In questa fase,

  • Apri Risorse del computer e vai alla seguente directory "C:\sqlite" e
  • Quindi apri “sqlite3.exe”:

SQLite Interrogazione: INSERISCI, AGGIORNA, ELIMINA

Passo 2) Aprire il database “TutorialsSampleDB.db” con il seguente comando:

.open TutorialsSampleDB.db

SQLite Interrogazione: INSERISCI, AGGIORNA, ELIMINA

Ora sei pronto per eseguire qualsiasi tipo di query sul database.

SQLite INSERT

SQLite INSERT viene utilizzato per inserire record in una tabella specificata del database. devi usare la clausola 'INSERT'. La sintassi della clausola INSERT è la seguente:

SQLite INSERT

  • Dopo la clausola INSERT, dovresti indicare in quale tabella devi inserire i valori.
  • Dopo il nome della tabella, scrivi l'elenco delle colonne in cui vuoi inserire i valori.
  • Puoi ignorare il nome delle colonne e non scrivervi.
  • Se non scrivi il nome delle colonne, i valori verranno inseriti in tutte le colonne trovate nella tabella con lo stesso ordine, le colonne sono definite nella tabella.
  • Dopo la clausola VALUES, dovresti elencare i valori da inserire.
  • Ciascuna clausola INSERT inserisce solo una riga. Se vuoi inserire più righe, dovresti scrivere più clausole INSERT, una per ogni riga.

SQLite Inserisci esempio

Nell'esempio seguente, inseriremo 2 righe nella tabella degli studenti, una per ogni studente:

INSERT INTO Students(StudentId, StudentName, DepartmentId, DateOfBirth)
              VALUES(11, 'Ahmad', 4, '1997-10-12');

INSERT INTO Students VALUES(12, 'Aly', 4, '1996-10-12');

Questo dovrebbe funzionare correttamente e non c'è alcun output per questo:

SQLite inserire

Verranno inseriti due studenti:

  • Il primo studente con StudentId=11, StudentName = Ahmad, DepartmentId = 4 e DateOfBirth = 1997-10-12.
  • Il secondo studente con StudentId=12, StudentName = Aly, DepartmentId = 4 e DateOfBirth = 1996-10-12'.

Nella prima istruzione, abbiamo elencato i nomi delle colonne "StudentId, StudentName, DepartmentId, DateOfBirth". Tuttavia, nella seconda istruzione, non lo abbiamo fatto.

I quattro valori “12, 'Aly', 4, '1996-10-12'” verranno inseriti in tutte e quattro le colonne della tabella Students nello stesso ordine in cui le colonne sono definite.

Ora, verifichiamo che i due studenti siano stati inseriti nella tabella Studenti eseguendo quanto segue domanda:

SELECT * FROM Students;

Dovresti quindi vedere i due studenti restituiti da quella query come segue:

SQLite inserire

SQLite Aggiornanento

SQLite La query UPDATE viene utilizzata per modificare i record esistenti in una tabella. È possibile utilizzare la clausola WHERE con la query UPDATE per aggiornare le righe selezionate. La clausola UPDATE aggiorna una tabella modificando un valore per una colonna specifica. Di seguito è riportata la sintassi della clausola UPDATE:

SQLite Aggiornanento

Come segue:

  • Dopo la "clausola di aggiornamento", dovresti scrivere il nome della tabella da aggiornare.
  • Devi scrivere la "clausola SET" che viene utilizzata per scrivere il nome della colonna da aggiornare e il valore da aggiornare.
  • È possibile aggiornare più di una colonna. Puoi usare una virgola tra ogni riga.
  • È possibile specificare una clausola WHERE per specificare solo alcune righe. Vengono aggiornate solo le righe che l'espressione restituisce true. Se non hai specificato una clausola WHERE, tutte le righe verranno aggiornate.

SQLite Esempio di aggiornamento

Nella seguente istruzione UPDATE, aggiorneremo il DepartmentId per lo studente con StudentId = 6 in modo che sia 3:

UPDATE Students
SET DepartmentId = 3 
WHERE StudentId = 6;

Questo dovrebbe funzionare correttamente e non dovresti ottenere alcun output:

SQLite Aggiornanento

Nella clausola UPDATE abbiamo specificato che vogliamo aggiornare la tabella Studenti.

  • Nella clausola WHERE abbiamo filtrato tutti gli studenti per selezionare solo la riga per StudentId = 6.
  • La clausola SET aggiornerà il valore dell'ID Dipartimento per gli studenti selezionati a 3.

Ora verifichiamo che lo studente con ID 6 sia aggiornato, eseguendo il seguente comando:

SELECT * FROM Students WHERE StudentId = 6;

Ora dovresti vedere che il valore dell'ID dipartimento è 3 come segue:

SQLite Aggiornanento

SQLite Elimina

SQLite La query DELETE viene utilizzata per rimuovere i record esistenti da una tabella specificata. È possibile utilizzare la clausola WHERE con le query DELETE per eliminare le righe selezionate.

La clausola DELETE ha la seguente sintassi:

SQLite Elimina

  • Dopo la clausola DELETE FROM, è necessario specificare il nome della tabella da cui si desidera eliminare i record. (Nota: la clausola DELETE viene utilizzata per eliminare alcuni record da una tabella o tutti i record, ma non elimina la tabella stessa. La clausola DROP, invece, viene utilizzata per eliminare l'intera tabella con tutti i record in essa contenuti.)
  • Se scrivi la clausola DELETE in questo modo “DELETE FROM guru”, questo cancellerà tutti i record dalla tabella “guru”.
  • Puoi specificare una condizione WHERE con un'espressione se desideri eliminare alcune righe specifiche. Verranno eliminate solo le righe per le quali l'espressione restituisce true. Ad esempio, “DELETE FROM guru WHERE id > 5” – questo eliminerà solo i record che hanno id maggiore di 5.

Esempio

Nella seguente istruzione elimineremo due studenti con StudentId 11 e 12:

DELETE FROM Students WHERE StudentId = 11 OR StudentId = 12;

L'espressione "StudentId = 11 OR StudentId = 12" sarà vera solo per gli studenti con ID 11 e 12. Pertanto, la clausola DELETE verrà applicata a entrambi e cancellerà solo questi ultimi.

Questo comando dovrebbe essere eseguito correttamente e non dovresti ottenere alcun output come il seguente:

SQLite Elimina

È possibile verificare che i due studenti siano stati eliminati selezionando tutti i record dalla tabella Studenti come segue:

SELECT * FROM Students;

Non dovresti vedere i due studenti con ID 11 e 12 come segue:

SQLite Elimina

SQLite Clausola di conflitto

Supponiamo di avere una colonna che ha uno dei seguenti vincoli di colonna: UNIQUE, NOT NULL, CHECK o PRIMARY KEY. E poi hai provato a inserire o aggiornare un valore su quella colonna con un valore che è in conflitto con questo vincolo.

Ad esempio, se una colonna ha un vincolo UNIQUE e si tenta di inserire un valore già esistente (un valore duplicato), che è in conflitto con il vincolo UNIQUE. Quindi la clausola CONFLICT ti consente di scegliere cosa fare in questi casi per risolvere questo conflitto.

Prima di continuare a spiegare come la clausola CONFLICT risolve il conflitto. Dovresti capire cos'è una transazione di database.

Transazione del database

Il termine transazione del database è un elenco di SQLite operazioni (inserimento o aggiornamento o eliminazione). La transazione del database deve essere eseguita come un'unità, ovvero tutte le operazioni devono essere eseguite correttamente o nessuna. Tutte le operazioni saranno annullate se una di esse non è stata eseguita correttamente.

Esempio di transazione di database

L'operazione per trasferire denaro da un conto bancario a un altro comporterà un paio di attività. Questa operazione di transazione prevede il prelievo di denaro dal primo conto e il deposito su un altro conto. Questa transazione deve essere completamente completata o completamente annullata e non fallire a metà.

Ecco l'elenco delle cinque risoluzioni che puoi scegliere nella clausola CONFLICT:

  1. ROLLBACK – questa operazione annullerà la transazione in cui è attualmente in corso SQLite dichiarazione che presenta il conflitto (annullerà l'intera transazione). Ad esempio, se stai tentando di aggiornare 10 righe e la quinta riga ha un valore in conflitto con un vincolo, nessuna riga verrà aggiornata e le 10 righe rimarranno le stesse. Verrà generato un errore.
  2. ANNULLA – questo interromperà (annullerà) l'attuale SQLite solo l'istruzione che presenta conflitto e la transazione non verrà annullata. Ad esempio, se stai tentando di aggiornare 10 righe e la quinta riga ha un valore in conflitto con un vincolo, solo il quinto valore non verrà aggiornato ma verranno aggiornate le altre 9 righe. Verrà generato un errore.
  3. FALLIMENTO – interrompe l'operazione corrente SQLite affermazione che presenta conflitto. Tuttavia, la transazione non continuerà ma verranno applicate le modifiche apportate alle righe precedenti a quella in conflitto. Ad esempio, se stai tentando di aggiornare 10 righe e la quinta riga ha un valore in conflitto con un vincolo, verranno aggiornate solo le 4 righe e l'altra no. Verrà generato un errore.
  4. IGNORA – questa operazione salterà la riga che contiene la violazione del vincolo e continuerà a elaborare le altre righe seguenti del SQLite dichiarazione. Ad esempio, se stai tentando di aggiornare 10 righe e la quinta riga ha un valore in conflitto con un vincolo, verranno aggiornate solo le 4 righe e l'altra no. Non procederà oltre per aggiornare le altre righe e si fermerà alla riga con il valore di conflitto. Non verrà generato alcun errore.
  5. SOSTITUISCI – dipende dal tipo di vincolo che presenta la violazione:
    • Quando si verifica una violazione del vincolo UNIQUE o PRIMARY KEY. Il REPLACE sostituirà la riga che causa la violazione con la nuova riga inserita o aggiornata.
    • Quando si verifica una violazione del vincolo NOT NULL, la clausola REPLACE sostituirà il valore NULL con il valore predefinito di quella colonna. Se la colonna non ha un valore predefinito, allora SQLite annullerà l'istruzione (l'istruzione verrà annullata)
    • SE si verifica la violazione del vincolo CHECK, la clausola verrà interrotta.

Nota: le 5 soluzioni sopra elencate sono opzioni su come si desidera risolvere il conflitto. Non è detto che ciò che è applicabile a un tipo di conflitto sia applicabile anche ad altri tipi di conflitto.

Come dichiarare la clausola CONFLICT

Puoi dichiarare la clausola ON CONFLICT quando definisci un vincolo per una definizione di colonna all'interno della clausola CREATE TABLE. Utilizzando la seguente sintassi:

SQLite Clausola di conflitto

Puoi scegliere una delle cinque soluzioni per risolvere il conflitto come spiegato in precedenza.

SUL CONFLITTO IGNORA Esempio

Passo 1) Creare un nuovo oggetto della tabella come segue:

CREATE TABLE [Subjects] (  
    [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT IGNORE,
    [SubjectName] NVARCHAR NOT NULL
);

Si noti che abbiamo definito un vincolo di CHIAVE PRIMARIA sulla colonna SubjectId. Il vincolo di chiave primaria impedirà l'inserimento di due valori duplicati nella colonna SubjectId, garantendo così che tutti i valori in tale colonna siano univoci. Si noti inoltre che abbiamo scelto "IGNORA" come metodo di risoluzione dei conflitti.

Il comando dovrebbe essere eseguito correttamente e non dovresti ricevere alcun errore:

SUL CONFLITTO IGNORA Esempio

Passo 2) Ora inseriamo alcuni valori nei nuovi oggetti della tabella, ma con un valore che viola il vincolo della chiave primaria:

INSERT INTO Subjects VALUES(1, 'Algebra');
INSERT INTO Subjects VALUES(2, 'Database Course');
INSERT INTO Subjects VALUES(2, 'Data Structures');
INSERT INTO Subjects VALUES(4, 'Algorithms');

In queste istruzioni INSERT, abbiamo provato a inserire due corsi con lo stesso ID oggetto della chiave primaria 2, che rappresenta una violazione del vincolo della chiave primaria.

I comandi dovrebbero funzionare correttamente e non dovresti ricevere errori. Come segue:

SUL CONFLITTO IGNORA Esempio

Passo 3) Selezionare tutti gli argomenti dalla tabella come segue:

SELECT * FROM Subjects;

Questo ti darà l'elenco degli argomenti:

SUL CONFLITTO IGNORA Esempio

Nota che sono stati inseriti solo tre argomenti: "Algebra, Corso di database e Algorithms" invece di 4 righe.

La riga con il valore che viola il vincolo di chiave primaria, ovvero "Strutture dati", è stata ignorata e non inserita. Tuttavia, SQLite continua a eseguire altre istruzioni dopo quella riga.

Passo 4) ELIMINA gli argomenti della tabella per crearla nuovamente con una clausola ON CONFLICT diversa per l'esempio seguente eseguendo il seguente comando:

DROP TABLE Subjects;

Il comando drop cancella l'intera tabella. Gli oggetti della tabella ora non esistono.

SOSTITUZIONE CONFLITTO Esempio

Passo 1) Creare un nuovo oggetto della tabella come segue:

CREATE TABLE [Subjects] (  
    [SubjectId] INTEGER NOT NULL PRIMARY KEY ON CONFLICT REPLACE,
    [SubjectName] NVARCHAR NOT NULL
);

Si noti che abbiamo definito un vincolo PRIMARY KEY sulla colonna ObjectId. Il vincolo di chiave primaria non consentirà l'inserimento di due valori duplicati nella colonna ObjectId in modo che tutti i valori in quella colonna siano univoci.

Inoltre, notate che abbiamo scelto "SOSTITUISCI" come opzione di risoluzione dei conflitti. Il comando dovrebbe essere eseguito correttamente e non dovreste ricevere alcun errore:

SOSTITUZIONE CONFLITTO Esempio

Passo 2) Ora inseriamo alcuni valori nella nuova tabella Objects, ma con un valore che violi il vincolo di chiave primaria:

INSERT INTO Subjects VALUES(1, 'Algebra');
INSERT INTO Subjects VALUES(2, 'Database Course');
INSERT INTO Subjects VALUES(2, 'Data Structures');
INSERT INTO Subjects VALUES(4, 'Algorithms');

In queste istruzioni INSERT, abbiamo provato a inserire due corsi con lo stesso ID oggetto della chiave primaria 2, che rappresenta una violazione del vincolo della chiave primaria.

I comandi dovrebbero funzionare correttamente e non dovresti ricevere errori. Come segue:

SOSTITUZIONE CONFLITTO Esempio

Passo 3) Selezionare tutti gli argomenti dalla tabella come segue:

SELECT * FROM Subjects;

Questo ti darà l'elenco degli argomenti:

SOSTITUZIONE CONFLITTO Esempio

Si noti che sono stati inseriti solo tre soggetti: "Algebra, Strutture dati e Algorithms” mentre noi abbiamo provato ad inserire 4 righe.

La riga che presenta il valore che viola il vincolo di chiave primaria, ovvero "Strutture dati", ha sostituito il valore "Corso di database" come segue:

  • Le prime due istruzioni di inserimento vengono eseguite correttamente senza problemi. Verranno inserite due materie Algebra e Corso Database con ID 1, 2.
  • Quando SQLite Il sistema tenta di eseguire la terza istruzione INSERT con SubjectId 2 e SubjectName "Data Structures", ma rileva che esiste già un soggetto con SubjectId = 2. Ciò costituisce una violazione del vincolo di chiave primaria definito sulla colonna SubjectId.
  • SQLite Per risolvere questo conflitto, verrà scelta la risoluzione REPLACE. Il valore già presente nella tabella Subjects verrà sostituito con il nuovo valore proveniente dall'istruzione INSERT. Pertanto, SubjectName "Database Course" verrà sostituito con SubjectName "Data Structures".

DOMANDE FREQUENTI

UPSERT combina inserimento e aggiornamento. Poiché SQLite 3.24.0 (2018), INSERT INTO … ON CONFLICT(column) DO UPDATE SET … inserisce una nuova riga o aggiorna quella esistente quando si verifica un conflitto di CHIAVE UNIQUE o PRIMARY KEY. DO NOTHING invece salta la riga silenziosamente.

INSERISCI O SOSTITUISCI elimina la riga in conflitto e ne inserisce una nuova, quindi le colonne non elencate vengono ripristinate ai valori predefiniti. SU CONFLITTO FAI AGGIORNAMENTO modifica la riga esistente sul posto, mantenendoping le altre colonne rimangono intatte, il che lo rende l'operazione di upsert più sicura.

Elenca diversi gruppi di valori dopo VALUES, separati da virgole: INSERT INTO Students (id, name) VALUES (1,'A'), (2,'B'), (3,'C');. Questa forma a più righe funziona poiché SQLite 3.7.11 ed è più veloce dell'esecuzione di un'istruzione INSERT per riga.

Eseguire DELETE FROM table_name; senza una clausola WHERE. SQLite Non dispone di un comando TRUNCATE, ma applica un'ottimizzazione di troncamento che elimina tutte le righe contemporaneamente. La struttura della tabella rimane invariata; utilizzare DROP TABLE per rimuovere completamente la tabella.

Dal SQLite 3.35.0 (2021), INSERT, UPDATE e DELETE accettano una clausola RETURNING opzionale che restituisce le righe interessate. Ad esempio, INSERT … RETURNING id; restituisce immediatamente i valori generati, evitando una SELECT separata per leggere le modifiche.

Utilizzare INSERT INTO … SELECT: INSERT INTO Archive (id, name) SELECT id, name FROM Students WHERE DepartmentId = 4;. SQLite Inserisce ogni riga restituita dalla SELECT, quindi l'ordine e il numero delle colonne devono corrispondere alla tabella di destinazione.

Sì. Gli assistenti AI text-to-SQL convertono le richieste in inglese semplice in SQLite Istruzioni INSERT, UPDATE e DELETE, incluse le clausole WHERE e ON CONFLICT. Fornire i nomi di tabelle e colonne migliora la precisione, e ogni istruzione generata dovrebbe essere rivista e testata prima di essere eseguita su dati reali.

Copilota GitHub suggerisce SQLite Query INSERT, UPDATE e DELETE in linea in editor come VS CodeLegge lo schema e i commenti nelle vicinanze, quindi i completamenti riutilizzano i nomi reali di tabelle e colonne, ma è comunque consigliabile verificare ogni istruzione prima dell'esecuzione.

Riassumi questo post con: