✏️ INSERT, UPDATE, DELETE
DML (Data Manipulation Language) vaicājumi pievieno, maina un dzēš datus tabulās. Obligāti izmanto WHERE pie UPDATE un DELETE, lai nepazaudētu visus datus!
INSERT – datu pievienošana
-- Viena rinda (norādot kolonnas – ieteicamais veids)
INSERT INTO products (name, price, category, in_stock)
VALUES ('iPhone 16', 1199.00, 'Elektronika', 1);
-- Var izlaist kolonlas ar DEFAULT vai NULL atļāvumu
INSERT INTO products (name, price)
VALUES ('Peles paliktnis', 9.99); -- category un in_stock iegūs DEFAULT
-- Vairākas rindas vienā vaicājumā (ātri!)
INSERT INTO products (name, price, category) VALUES
('MacBook Pro', 2499.00, 'Datori' ),
('iPad Air', 799.00, 'Planšetes' ),
('AirPods Pro', 299.00, 'Elektronika'),
('USB-C kabelis', 9.99, 'Aksesuāri' );
-- Iegūt pievienotās rindas ID
-- (PHP: $pdo->lastInsertId())
SELECT LAST_INSERT_ID();
-- INSERT ... SET (alternatīvs formāts)
INSERT INTO users SET
username = 'anna.berzina',
email = 'anna@example.lv',
password = '$2y$12$...'; -- bcrypt hash
-- INSERT IGNORE – izlaist, ja unikālā atslēga jau eksistē
INSERT IGNORE INTO products (name, price)
VALUES ('iPhone 16', 999.00); -- Neko nedarīs, ja name ir UNIQUE
-- ON DUPLICATE KEY UPDATE – ievietot vai atjaunināt
INSERT INTO products (name, price, in_stock)
VALUES ('iPhone 16', 1099.00, 1)
ON DUPLICATE KEY UPDATE
price = VALUES(price),
in_stock = VALUES(in_stock);
UPDATE – datu atjaunināšana
-- VIENMĒR lieto WHERE, lai neatjauninātu VISAS rindas!
-- Mainīt vienu lauku
UPDATE products
SET price = 999.00
WHERE id = 1;
-- Mainīt vairākus laukus
UPDATE products
SET
price = 1099.00,
in_stock = 1,
category = 'Elektronika'
WHERE id = 1;
-- Mainīt visus ierakstus, kas atbilst nosacījumam
UPDATE products
SET in_stock = 0
WHERE category = 'Apģērbs' AND price > 200;
-- Palielināt / samazināt skaitlisko vērtību
UPDATE products SET price = price * 1.10 WHERE category = 'Elektronika'; -- +10%
UPDATE orders SET total = total - 5.00 WHERE coupon_code = 'ATLAIDE5';
-- Atjaunināt, izmantojot citas tabulas datus (UPDATE ... JOIN)
UPDATE products p
JOIN categories c ON p.category_id = c.id
SET p.category = c.name
WHERE c.parent_id IS NULL;
-- LIMIT ar UPDATE (piesardzībai)
UPDATE products SET in_stock = 1
WHERE in_stock = 0
LIMIT 100; -- Atjaunina maksimums 100 rindas uzreiz
-- Pārbaudīt pirms UPDATE ar SELECT
SELECT * FROM products WHERE category = 'Apģērbs' AND price > 200;
-- Ja rezultāts izskatās pareizi – aizstāj SELECT * ar UPDATE ... SET
DELETE – datu dzēšana
⚠️ Drošā DELETE prakse
Pirms DELETE – vienmēr vispirms palaid to pašu vaicājumu ar SELECT, lai redzētu, kas tiks dzēsts. Svarīgās tabulās izmanto Soft Delete — pievieno kolonnu deleted_at DATETIME NULL DEFAULT NULL un filtrē ar WHERE deleted_at IS NULL, nevis fiziski dzēš.
-- Dzēst vienu ierakstu pēc ID DELETE FROM products WHERE id = 5; -- Dzēst ar nosacījumu DELETE FROM orders WHERE status = 'atcelts' AND created_at < '2024-01-01'; -- Dzēst un ierobežot skaitu DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY) LIMIT 1000; -- TRUNCATE – iztīrīt visu tabulu (ĀTRĀK nekā DELETE bez WHERE) TRUNCATE TABLE sessions; -- Dzēš visu, atiestata AUTO_INCREMENT -- DROP TABLE – dzēst tabulu kopā ar struktūru DROP TABLE IF EXISTS temp_imports; -- Pirms DELETE – pārbaudīt ar SELECT! SELECT * FROM products WHERE price < 0; -- Ja pareizi: DELETE FROM products WHERE price < 0;
Transakcijas – drošas darbības
Transakcija nodrošina, ka vai nu visas izmaiņas tiek saglabātas, vai neviena.
-- Transakcijas sākums START TRANSACTION; -- vai: BEGIN; -- Darbības UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- Nosūtīt 100€ UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- Saņemt 100€ -- Ja viss kārtībā – saglabāt COMMIT; -- Ja kaut kas nogāja greizi – atcelt VISU ROLLBACK; -- Piemērs ar kļūdu pārbaudi (pseudokods) -- START TRANSACTION; -- UPDATE accounts SET balance = balance - 100 WHERE id = 1; -- (Pārbaudīt, vai balance nav negatīvs) -- UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- COMMIT; <-- tikai ja abas darbības izdevās -- SAVEPOINT – daļēja atcelšana START TRANSACTION; INSERT INTO orders (user_id, total) VALUES (1, 99.99); SAVEPOINT pec_orders; INSERT INTO order_items (order_id, product_id) VALUES (LAST_INSERT_ID(), 5); -- Ja kļūda: ROLLBACK TO SAVEPOINT pec_orders; -- Atceļ tikai order_items -- COMMIT;