0%

✏️ 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!

sql

INSERT – datu pievienošana

Teksts
-- 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

Teksts
-- 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ēš.

Teksts
-- 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.

Teksts
-- 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;