rDBMS oferă diferite modalități de a introduce date în stocarea lor: de la fișiere CSV, fișiere Excel, fișiere binare specifice produsului, prin mai multe API-uri sau porți speciale de la alte baze de date, respectiv sisteme de baze de date și alte tehnici. Deci, există o gamă largă de posibilități – nestandardizate – de a aduce date în sistemul nostru. Pentru că vorbim despre SQL, folosim comanda standardizată INSERT pentru a face treaba. Este disponibil[ pe toate sistemele.
Folosim doar o cantitate mică de date pentru că dorim să menținem lucrurile simple. Uneori este nevoie de un număr mare de rânduri pentru a face teste de performanță. În acest scop, arătăm o comandă specială INSERT la sfârșitul acestui articol, care crește exponențial tabelul.
person
--
-- After we have done a lot of tests we may want to reset the data to its original version.
-- To do so, use the DELETE command. But be aware of Foreign Keys: you may be forced to delete
-- persons at the very end - with DELETE it's just the opposite sequence of tables in comparison to INSERTs.
-- Be careful and don't confuse DELETE with DROP !!
--
-- DELETE FROM person_hobby;
-- DELETE FROM hobby;
-- DELETE FROM contact;
-- DELETE FROM person;
-- COMMIT;
INSERT INTO person VALUES (1, 'Larry', 'Goldstein', DATE'1970-11-20', 'Dallas', '078-05-1120', 95);
INSERT INTO person VALUES (2, 'Tom', 'Burton', DATE'1977-01-22', 'Birmingham', '078-05-1121', 75);
INSERT INTO person VALUES (3, 'Lisa', 'Hamilton', DATE'1975-12-23', 'Richland', '078-05-1122', 56);
INSERT INTO person VALUES (4, 'Kim', 'Goldstein', DATE'2011-06-01', 'Shanghai', '078-05-1123', 11);
INSERT INTO person VALUES (5, 'James', 'de Winter', DATE'1975-12-23', 'San Francisco', '078-05-1124', 75);
INSERT INTO person VALUES (6, 'Elias', 'Baker', DATE'1939-10-03', 'San Francisco', '078-05-1125', 55);
INSERT INTO person VALUES (7, 'Yorgos', 'Stefanos', DATE'1975-12-23', 'Athens', '078-05-1126', 64);
INSERT INTO person VALUES (8, 'John', 'de Winter', DATE'1977-01-22', 'San Francisco', '078-05-1127', 77);
INSERT INTO person VALUES (9, 'Richie', 'Rich', DATE'1975-12-23', 'Richland', '078-05-1128', 90);
INSERT INTO person VALUES (10, 'Victor', 'de Winter', DATE'1979-02-28', 'San Francisco', '078-05-1129', 78);
COMMIT;
Vă rugăm să rețineți că formatul DATE poate depinde de mediul dvs. local. Mai mult, SQLite folosește o sintaxă diferită pentru conversia implicită din șir în DATE.
-- SQLite syntax
INSERT INTO person VALUES (1, 'Larry', 'Goldstein', DATE('1970-11-20'), 'Dallas', '078-05-1120', 95);
...
contact
-- DELETE FROM contact;
-- COMMIT;
INSERT INTO contact VALUES (1, 1, 'fixed line', '555-0100');
INSERT INTO contact VALUES (2, 1, 'email', 'larry.goldstein@acme.xx');
INSERT INTO contact VALUES (3, 1, 'email', 'lg@my_company.xx');
INSERT INTO contact VALUES (4, 1, 'icq', '12111');
INSERT INTO contact VALUES (5, 4, 'fixed line', '5550101');
INSERT INTO contact VALUES (6, 4, 'mobile', '10123444444');
INSERT INTO contact VALUES (7, 5, 'email', 'james.dewinter@acme.xx');
INSERT INTO contact VALUES (8, 7, 'fixed line', '+30000000000000');
INSERT INTO contact VALUES (9, 7, 'mobile', '+30695100000000');
COMMIT;
hobby
-- DELETE FROM hobby;
-- COMMIT;
INSERT INTO hobby VALUES (1, 'Painting',
'Applying paint, pigment, color or other medium to a surface.');
INSERT INTO hobby VALUES (2, 'Fishing',
'Catching fishes.');
INSERT INTO hobby VALUES (3, 'Underwater Diving',
'Going underwater with or without breathing apparatus (scuba diving / breath-holding).');
INSERT INTO hobby VALUES (4, 'Chess',
'Two players have 16 figures each. They move them on an eight-by-eight grid according to special rules.');
INSERT INTO hobby VALUES (5, 'Literature', 'Reading books.');
INSERT INTO hobby VALUES (6, 'Yoga',
'A physical, mental, and spiritual practices which originated in ancient India.');
INSERT INTO hobby VALUES (7, 'Stamp collecting',
'Collecting of post stamps and related objects.');
INSERT INTO hobby VALUES (8, 'Astronomy',
'Observing astronomical objects such as moons, planets, stars, nebulae, and galaxies.');
INSERT INTO hobby VALUES (9, 'Microscopy',
'Observing very small objects using a microscope.');
COMMIT;
person_hobby
-- DELETE FROM person_hobby;
-- COMMIT;
INSERT INTO person_hobby VALUES (1, 1, 1);
INSERT INTO person_hobby VALUES (2, 1, 4);
INSERT INTO person_hobby VALUES (3, 1, 5);
INSERT INTO person_hobby VALUES (4, 5, 2);
INSERT INTO person_hobby VALUES (5, 5, 3);
INSERT INTO person_hobby VALUES (6, 7, 8);
INSERT INTO person_hobby VALUES (7, 4, 4);
INSERT INTO person_hobby VALUES (8, 9, 8);
INSERT INTO person_hobby VALUES (9, 9, 9);
COMMIT;
Creştere
Pentru teste de performanță realiste, avem nevoie de o cantitate mare de date. Numărul mic de rânduri din baza noastră de date din exemplu nu îndeplinește acest criteriu. Cum putem genera date de testare și să le stocăm într-un tabel? Există diferite posibilități: bucle FOR într-o procedură, apeluri (pseudo-) recursive, importarea datelor externe într-un mod specific sistemului și altele.
Deoarece avem de-a face cu SQL, introducem o comandă INSERT, care este portabilă în toate rDBMS. Deși are o sintaxă simplă, este foarte puternică. Cu fiecare execuție, se va dubla numărul de rânduri. Să presupunem că există 1 rând într-un tabel. După prima execuție, va exista un al doilea rând în tabel. La prima vedere, acest lucru sună plictisitor. Dar după 10 execuții sunt mai mult de o mie de rânduri, după 20 de execuții sunt mai mult de un milion și bănuim că doar câteva instalații îl pot executa de peste 30 de ori.
INSERT INTO person (id, firstname, lastname, weight)
SELECT id + (select max(id) from person), firstname, lastname, weight
FROM person;
COMMIT;
Comanda este o INSERT în combinație cu o (Sub-)SELECT. SELECT preia toate rândurile tabelului deoarece nu există nicio clauză WHERE. Acesta este motivul dublării. Coloanele obligatorii firstname și lastname rămân neschimbate. Ignorăm coloanele opționale. Numai cheia primară id este calculată. Noua valoare este suma vechii valori plus cel mai mare id disponibil la pornirea comenzii.
Alte observații:
- max(id) este determinat o singură dată pe execuție! Aceasta ilustrează un aspect esențial al rDBMS: la nivel conceptual, baza de date are o stare anume înainte de executarea unei comenzi și o stare nouă după executarea acesteia. Comenzile sunt operațiuni atomice care mută baza de date dintr-o stare în alta – rulează în întregime sau deloc! Atât SELECT, cât și SELECT interior cu max(id) acționează asupra stării inițiale. Ele nu văd niciodată rezultatul sau un rezultat intermediar al INSERT. Altfel, INSERT nu s-ar termina niciodată.
- Dacă dorim să observăm procesul de creștere, putem adăuga o coloană la tabel pentru a stoca max(id) cu fiecare iterație.
- Calculul noului id poate fi omis dacă DBMS acceptă coloane AUTOINCREMENT.
- Pentru testele de performanță, poate fi util să stocați unele date aleatorii într-una sau mai multe coloane.
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns