Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИО.ЛР.2.SQL.Работа со структурой БД.doc
Скачиваний:
0
Добавлен:
04.01.2020
Размер:
566.27 Кб
Скачать

4.3.5 Создадим таблицу «Доставка»

DROP TABLE IF EXISTS `Доставка` ;

CREATE TABLE IF NOT EXISTS `Доставка`

(

`Код доставки` INT UNSIGNED NOT NULL AUTO_INCREMENT ,

`Код заказа` INT UNSIGNED NOT NULL ,

`Дата и время доставки` DATETIME NULL ,

`Код клиента` INT UNSIGNED NOT NULL ,

PRIMARY KEY (`Код доставки`) ,

INDEX `FKOrder` (`Код заказа` ASC) ,

INDEX `FKClient2` (`Код клиента` ASC) , -- Важно! В системе не должно быть двух индексов с одинаковыми именами!

CONSTRAINT `FKOrder`

FOREIGN KEY (`Код заказа` )

REFERENCES `Заказы` (`Код Заказа` ),

CONSTRAINT `FKClient2`

FOREIGN KEY (`Код клиента` )

REFERENCES `Клиенты` (`Код Клиента` )

);

Как и в предыдущие разы, на всякий случай можно проверить структуру таблицы.

DESC Доставка;

*Примечание: В данном случае удобно в конце строки «;» заменить на «\G» - это преобразует результат в «вертикальную форму». Так стоит делать, если в стандартном представлении строки наползают друг на друга.

DESC Доставка \G

Теперь выполним заполнение таблиц.

4.3.6 Заполним таблицу «Интернет-Магазины»

INSERT INTO `Интернет-Магазины` (`Электронный адрес`, `Оплата доставки`) -- Указываем, какие столбцы мы собираемся заполнять. Первый столбец опустим т.к. при создании таблицы мы указали, чтобы он заполнялся автоматически.

VALUES ('lalala@mail.ru','да'),

('magazin431@gmail.com','да'),

('supershop@supershop.ru','нет'),

('goods@xxx.com','да'),

('neverwinter@nights.com','да');

Проверим правильность заполнения оператором SELECT.

SELECT * FROM `Интернет-магазины`;

4.3.7 Заполним таблицу «Товары»

INSERT INTO Товары -- Можно не указывать, какие именно столбцы будут заполняться данным запросом. В таком случае необходимо будет заполнить все столбцы. Причем, не в том порядке, в котором мы их обозначали в таблице, а в том, в каком они реально существуют в БД.

VALUES (NULL,'Чайник','Braun',1500), -- Т.к. для первого столбца мы при создании таблицы поставили автозаполнение, то при вводе значений в таблицу, данный столбец заполнять не нужно. В матрице данных отсутствие значение обозначаем NULL.*

(NULL,'Пылесос','Samsung',3500),

(NULL,'Электровеник','Yamaha',999),

(NULL,'Микроволновка','Whirlpool',5000),

(NULL,'Электротерка','Yamaha',999),

(NULL,'Кофеварка','Braun',1500),

(NULL,'Холодильник','Samsung',5800),

(NULL,'R2-D2','Sony',150000);

*NULL – это не ноль. Это отсутствие вообще, какого бы ни было значения. Важно понимать следующие моменты: NULL ≠ 0, NULL+1 = NULL.

Проверим заполнение таблицы.

SELECT * FROM Товары;

Мы видим, что колонка «Код товара» заполнилась автоматически. Если же попробовать указать уже существующий номер кода товара, например:

INSERT INTO Товары

VALUES (5,'Золотой Самовар','Braun',800000);

Получим следующую ошибку:

Повторение «5» для первичного ключа. А первичный ключ по определению должен быть уникальным. Программа не позволяет нарушить это правило.

4.3.8 Заполним таблицу «Клиенты»

INSERT INTO Клиенты

VALUES (NULL, 'Петров И.И.', '1234567', 'Москва, ул. Пахарей 17-5'),

(NULL, 'Иванов П.П.', '8901234', 'Москва, ул. Слесарей 22-1д-2'),

(NULL, 'Сумкин Ф.Б.', '5678901', 'МО, Химки, ул. Улицы 42-123'),

(NULL, 'Сидоров С.М.', '4145252', 'Москва, ул. Бауманская 212-2'),

(NULL, 'Пушкин С.А.', '9982989', 'Магадан, ул. Пушкина 12-44');

Допустим, мы не хотим, чтобы в нашу таблицу могли ввести второго человека с такой же фамилией и инициалами.

Для этого Модифицируем таблицу «Клиенты», введя уникальный индекс, который запретит вводить повторяющиеся значения по столбцу «ФИО Клиента».

Для начала удалим уже существующий НЕуникальный индекс.

ALTER TABLE Клиенты DROP INDEX `ixClient`;

Добавим уникальный индекс, накладывающий ограничение на столбец «ФИО Клиента»:

ALTER TABLE Клиенты ADD CONSTRAINT `ixName` UNIQUE INDEX (`ФИО Клиента`);

Теперь, если попробовать ввести повторяющееся значение фамилии, то команда не пройдет.

INSERT INTO Клиенты

VALUES (NULL, 'Петров И.И.', '4440102', 'Москва, ул. Сезам 1-5');

Предположим, у нас есть список фамилий, которые необходимо ввести и среди этого списка могут встречаться повторяющиеся. В этом случае ни одна из фамилий списка не будет введена. Одна единственная повторяющаяся фамилия отменит всю команду. Чтобы этого не происходило, и все фамилии благополучно записались в БД проигнорировав повтор, нужно использовать команду IGNORE. (Повторенная фамилия записана не будет, зато запишутся все остальные.)

INSERT IGNORE INTO Клиенты

VALUES (NULL, 'Петров Т.П.', '4440102', 'Москва, ул. Сезам 1-5'),

(NULL, 'Сидорова А.К.', '4145252', 'Москва, ул. Бауманская 212-2'),

(NULL, 'Пушкин С.А.', '9982989', 'Магадан, ул. Пушкина 12-44');

Проверим правильность заполнения.

SELECT * FROM Клиенты;

Как мы видим, второй «Пушкин С.А.» записан не был.

Исправим инициалы первого (и единственного в нашей БД) Пушкина оператором UPDATE:

UPDATE Клиенты -- Обновить таблицу клиенты

SET `ФИО Клиента`= 'Пушкин А.С.' -- Установить «Пушкин А.С» в столбце «ФИО Клиента»

WHERE `ФИО Клиента` = 'Пушкин С.А.'; -- У тех строк, где «ФИО Клиента» равняется «Пушкин С.А.»

Можно было сделать то же самое, и другим способом:

UPDATE Клиенты -- Обновить таблицу клиенты

SET `ФИО Клиента`= 'Пушкин А.С.' -- Установить «Пушкин А.С» в столбце «ФИО Клиента»

WHERE `Код клиента` = 5; -- У тех строк, где «Код Клиента» равняется 5

Теперь удалим последнего Клиента из Таблицы.

DELETE FROM Клиенты

WHERE `Код Клиента` = 8;

*Чтобы удалить ВСЕ строки из таблицы следует написать « DELETE FROM Клиенты;»