Согласованность данных: Foreign Keys

Создаем внешний ключ (foreign keys) для таблицы product.
Связываем ее с таблицей shop.brand, выбираем для колонки brand_id связь с id.
Если On Delete = NO ACTION, то БД не даст удалить бренд, если есть товар с этим брендом в таблице product.
Если On Delete = CASCADE, то БД при удалении бренда каскадно удаляет и все товары с этим брендов в таблице product.

P.S. Возникла проблема с сохранением. Когда-то в таблице были некорректные данные и они коряво удалились. Поэтому Workbench думает, что они есть и не дает установить внешние ключи. Пришлось удалить таблицу и создать заново, чтобы все заработало.

Простые команды в MySQL

CREATE SCHEMA `shop` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;
# создать БД shop с кодировкой utf8 - utf8_bin

CREATE TABLE `shop`.`category` (
  `id` INT NOT NULL,
  `name` VARCHAR(128) NOT NULL,
  `discount` TINYINT NOT NULL,
  PRIMARY KEY (`id`));
/* создать в БД shop таблицу category со столбцами id, name, discount
столбец id принять за ключ доступа к строке */

INSERT INTO `shop`.`product_type` (`name`) VALUES ('Пальто'); 
# вставить в БД shop, в таблице product_type значение для переменной
# name равное "Пальто"
INSERT INTO `shop`.`category` (`name`, `discount`) VALUES ('Обувь', 5); 
# вставить в БД shop, в таблице category значения для переменных name,
# discount равное "Обувь", 5

SELECT * FROM shop.product_type;
# отобразить таблицу product_type из БД shop

use shop;
# выбираем БД shop, 
SELECT * FROM category WHERE id = 3;
# выбираем в таблице category элемент, где id = 3
SELECT * FROM category WHERE (discount > 0) AND (discount < 10);
# выбираем в таблице category элементs, удовлетворяющие условиям
SELECT FROM category WHERE alias_name IS NOT NULL; 
# для NULL используется IS или IS NOT, для всего остального = или <>
SELECT name, discount FROM category;
# выбрать столбцы name, discount из таблицы category
SELECT DISTINCT discount FROM category;
# выдает только уникальные значения
SELECT * FROM category ORDER BY discount;
# выводим всю таблицу с сортировкой по столбцу discount
SELECT * FROM category ORDER BY discount DESC;
# сортировка в обратном порядке (DESC)
SELECT * FROM category WHERE discount <> 0 ORDER BY discount;
# комбинация команд
SELECT * FROM category LIMIT 2;
# выводит только 2 первые строки из таблицы
UPDATE category SET name = 'Головные уборы' WHERE id = 3;
# обновляем в таблице category в столбце name на "Головные уборы" там, где id = 3
UPDATE category SET discount = 3 WHERE id IN (2,3);
# обновляем в таблице category в столбце discount на "3" там, где id = 2, 3
DELETE FROM category WHERE id =3;
# удаляем из таблицы category строки, где id = 3

 

SQL-инъекции: подстановка кода вместо пароля

Логин: skroob
Пароль: 12345′ OR ‘1’ = 1

Если исходный код SQL-таблицы  такой, то будут проблемы:

$username = $_POST["username"];
$password = $_POST["password"];
query("SELECT * FROM users WHERE username = $username AND password = $password");

// в итоге при подстановке логина и пароля получаем:
// query("SELECT * FROM users WHERE username = 'skroob' AND password = '12345' OR '1' = '1'");
// '1' = '1', поэтому вход будет произведен.

Правильный код:

$username = $_POST["username"];
$password = $_POST["password"];
query("SELECT * FROM users WHERE username = ? AND password = ?", $username, $password);

// в таком случае при подстановке пароля одинарные кавычки будут отделены дробью /'/