Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Здравствуйте! Помогите разобраться с удалением связанных таблиц. Я только начал самостоятельное изучение MySQL по видео урокам и столкнулся с ошибкой ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails (не удается удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется) при пересоздании таблиц базы DROP TABLE IF EXISTS katalog CASCADE; и т. д.. Помогите пожалуйста исправить ошибки. Есть ещё один вопрос о присвоение колонке значения суммы цены умноженной на количество. Это скрипт базы. Заранее благодарю за помощь!
-- База данных магазина
CREATE DATABASE new_eshop COLLATE utf8_general_ci;
USE new_eshop;
-- Решить два вопроса. 1) удаление связанных таблиц при пересоздании CASCADE!!!! 2) Присвоение значения суммы цены умноженной на количество
-- Таблица каталога товаров
DROP TABLE IF EXISTS katalog CASCADE;
CREATE TABLE katalog
(
idkat INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Код товара',
name VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Название товара',
autor VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Автор',
year YEAR(4) NOT NULL DEFAULT '0000' COMMENT 'Год издания',
publisher VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Издательство',
price DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT 'Цена товара',
CONSTRAINT pkIdkat PRIMARY KEY (idkat),
INDEX ixName (name),
INDEX ixAutor (autor),
INDEX ixPublisher (publisher),
INDEX ixPrice (price)
) COMMENT 'Таблица товаров c первичным ключом и индексами';
-- Таблица покупателей
DROP TABLE IF EXISTS buyers CASCADE;
CREATE TABLE buyers
(
idbuy INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id покупателя',
email VARCHAR(50) NOT NULL COMMENT 'логин',
password VARCHAR(50) COLLATE utf8_bin DEFAULT '' COMMENT 'Пароль',
secret_question VARCHAR(255) DEFAULT '' COMMENT 'Секретный вопрос',
answer VARCHAR(255) DEFAULT '' COMMENT 'Ответ на секретный вопрос',
fio VARCHAR(150) NOT NULL COMMENT 'Ф.И.О получателя',
phone VARCHAR(50) NOT NULL COMMENT 'Телефон',
address VARCHAR(255) NOT NULL COMMENT 'Адрес доставки',
CONSTRAINT pkIdbuy PRIMARY KEY (idbuy),
INDEX ixEmail (email),
INDEX ixFio (fio),
INDEX ixPhone (phone)
) COMMENT 'Таблица покупателей с первичным ключом и индексами';
-- Корзина заказов
DROP TABLE IF EXISTS basket;
CREATE TABLE basket
(
idbask INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id товара в корзине',
orderid VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Номер заказа может повторяться',
buyers_idbuy INT UNSIGNED NOT NULL COMMENT 'id покупателя может повторяться',
katakog_idkat INT UNSIGNED NOT NULL COMMENT 'id товара',
kolichestvo INT NOT NULL DEFAULT 1 COMMENT 'Количество товара',
sum DECIMAL(10,2) NOT NULL DEFAULT 0 /* price * kolichestvo */ COMMENT 'Цена товара * на количество',
date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Дата время размещения заказа',
CONSTRAINT pkIdbask PRIMARY KEY (idbask),
INDEX ixOrderid (orderid),
INDEX ixIdbuy (buyers_idbuy),
INDEX ixIdkat (katakog_idkat),
CONSTRAINT fkBuyersIdbuyBask FOREIGN KEY (buyers_idbuy)
REFERENCES buyers (idbuy),
CONSTRAINT fkKatalogIdkat FOREIGN KEY (katakog_idkat)
REFERENCES katalog (idkat)
) COMMENT 'Корзина товаров с первичным ключом индексами и связями с таблицами каталога и покупателями';
-- Получение товара тип цена
DROP TABLE IF EXISTS getting CASCADE;
CREATE TABLE getting
(
idget INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id типа и цены доставки',
type VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Тип доставки',
price DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT 'Цена доставки',
CONSTRAINT pkIdget PRIMARY KEY (idget),
INDEX ixType (type)
) COMMENT 'Таблица типа и цены доставки с первичным ключом';
-- Таблица типов оплаты и реквизитов
DROP TABLE IF EXISTS paytype CASCADE;
CREATE TABLE paytype
(
idpayt INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id типа оплаты',
type VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Тип Оплаты',
details VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Реквизиты',
CONSTRAINT pkIdpayt PRIMARY KEY (idpayt),
INDEX ixType (type)
) COMMENT 'Таблица типа оплаты и реквизитов с первичным ключом';
-- Таблица состояния оплаты заказа
DROP TABLE IF EXISTS payment CASCADE;
CREATE TABLE payment
(
idpaym INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id состояния оплаты заказа',
orderid VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Номер заказа не может повторяться',
paytype_idpayt INT UNSIGNED NOT NULL COMMENT 'id типа оплаты',
billed TEXT DEFAULT '' COMMENT 'Выставленный счёт если есть (документ)',
status ENUM('не оплачен','оплачен') NOT NULL DEFAULT 'не оплачен' COMMENT 'Статус оплаты заказа',
CONSTRAINT pkIdpaym PRIMARY KEY (idpaym),
CONSTRAINT ixOrderid UNIQUE KEY (orderid),
INDEX ixIdpayt (paytype_idpayt),
CONSTRAINT fkPaytypeIdpayt FOREIGN KEY (paytype_idpayt)
REFERENCES paytype (idpayt)
) COMMENT 'Таблица состояния оплаты заказа с первичным ключом';
-- Таблица заказов магазина
DROP TABLE IF EXISTS orders;
CREATE TABLE orders
(
idorders INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id Код заказа',
orderid VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Номер заказа не может повторяться',
buyers_idbuy INT UNSIGNED NOT NULL COMMENT 'id покупателя может повторяться с разными заказами',
sum_tovara DECIMAL(10,2) NOT NULL COMMENT 'Сумма всех товаров заказа',
getting_idget INT UNSIGNED NOT NULL COMMENT 'Тип получения товара и его цена',
order_amount DECIMAL(10,2) NOT NULL COMMENT 'Стоимость заказа с учётом выбранного типа получения',
payment_idpaym INT UNSIGNED NOT NULL COMMENT 'id состояния оплаты заказа',
processing_status ENUM('не обработан','обработан','отправлен','доставлен') DEFAULT 'не обработан' COMMENT 'Статус состояния обработки заказа',
date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Дата изменяемая при изменении статуса состояния обработки заказа',
CONSTRAINT pkIdorders PRIMARY KEY (idorders),
CONSTRAINT ixOrderid UNIQUE KEY (orderid),
INDEX ixIdbuy (buyers_idbuy),
INDEX ixIdget (getting_idget),
INDEX ixIdpaym (payment_idpaym),
CONSTRAINT fkBuyersIdbuy FOREIGN KEY (buyers_idbuy)
REFERENCES buyers (idbuy),
CONSTRAINT fkGettingIdget FOREIGN KEY (getting_idget)
REFERENCES getting (idget),
CONSTRAINT fkPaymentIdpaym FOREIGN KEY (payment_idpaym)
REFERENCES payment (idpaym)
) COMMENT 'Таблица сохранения заказов магазина';
Отредактированно Kolya (09.10.2017 14:23:51)
Неактивен
Kolya написал:
Здравствуйте! Помогите разобраться с удалением связанных таблиц. Я только начал самостоятельное изучение MySQL по видео урокам и столкнулся с ошибкой ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails (не удается удалить или обновить родительскую строку: ограничение внешнего ключа не выполняется) при пересоздании таблиц базы DROP TABLE IF EXISTS katalog CASCADE; и т. д..
см http://sqlinfo.ru/articles/info/30.html
Kolya написал:
Есть ещё один вопрос о присвоение колонке значения суммы цены умноженной на количество.
не ясно - какой колонке, как считается сумма, откуда берется кол-во и т.д.
Неактивен
После выполнения SHOW ENGINE INNODB STATUS\G секция LATEST FOREIGN KEY ERROR отвечает Cannot drop table `new_eshop`.`katalog` because it is referenced by `new_eshop`.`basket` (Не удается удалить таблицу ' new_eshop`.`Каталог` потому что на него ссылается `new_eshop`.`корзина`) но это я и сам понял. В лекции говориться что если добавить при удалении CASCADE то DROP TABLE IF EXISTS katalog CASCADE; будет удалять сначала дочерние таблицы а потом саму таблицу, а этого не происходит… По второму вопросу в таблице каталог есть колонка цена товара price в таблице корзина заказов есть колонка количество товара kolichestvo INT NOT NULL DEFAULT 1 COMMENT 'Количество товара', в следующую после неё колонку sum DECIMAL(10,2) NOT NULL DEFAULT 0 /* price * kolichestvo */ COMMENT 'Цена товара * на количество', нужно добавить сумму цена, умноженная на количество по DEFAULT. Количество товара меняет покупатель по желанию.
-- Таблица каталога товаров
DROP TABLE IF EXISTS katalog CASCADE;
CREATE TABLE katalog
(
idkat INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Код товара',
name VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Название товара',
autor VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Автор',
year YEAR(4) NOT NULL DEFAULT '0000' COMMENT 'Год издания',
publisher VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Издательство',
price DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT 'Цена товара',
CONSTRAINT pkIdkat PRIMARY KEY (idkat),
INDEX ixName (name),
INDEX ixAutor (autor),
INDEX ixPublisher (publisher),
INDEX ixPrice (price)
) COMMENT 'Таблица товаров c первичным ключом и индексами';
-- Корзина заказов
DROP TABLE IF EXISTS basket;
CREATE TABLE basket
(
idbask INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id товара в корзине',
orderid VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'Номер заказа может повторяться',
buyers_idbuy INT UNSIGNED NOT NULL COMMENT 'id покупателя может повторяться',
katakog_idkat INT UNSIGNED NOT NULL COMMENT 'id товара',
kolichestvo INT NOT NULL DEFAULT 1 COMMENT 'Количество товара',
sum DECIMAL(10,2) NOT NULL DEFAULT 0 /* price * kolichestvo */ COMMENT 'Цена товара * на количество',
date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Дата время размещения заказа',
CONSTRAINT pkIdbask PRIMARY KEY (idbask),
INDEX ixOrderid (orderid),
INDEX ixIdbuy (buyers_idbuy),
INDEX ixIdkat (katakog_idkat),
CONSTRAINT fkBuyersIdbuyBask FOREIGN KEY (buyers_idbuy)
REFERENCES buyers (idbuy),
CONSTRAINT fkKatalogIdkat FOREIGN KEY (katakog_idkat)
REFERENCES katalog (idkat)
) COMMENT 'Корзина товаров с первичным ключом индексами и связями с таблицами каталога и покупателями';
Неактивен
Kolya написал:
В лекции говориться что если добавить при удалении CASCADE то DROP TABLE IF EXISTS katalog CASCADE; будет удалять сначала дочерние таблицы а потом саму таблицу, а этого не происходит…
The RESTRICT and CASCADE keywords do nothing. They are permitted to make porting easier from other database systems.
https://dev.mysql.com/doc/refman/5.7/en/drop-table.html
Неактивен
Kolya написал:
По второму вопросу в таблице каталог есть колонка цена товара price в таблице корзина заказов есть колонка количество товара kolichestvo INT NOT NULL DEFAULT 1 COMMENT 'Количество товара', в следующую после неё колонку sum DECIMAL(10,2) NOT NULL DEFAULT 0 /* price * kolichestvo */ COMMENT 'Цена товара * на количество', нужно добавить сумму цена, умноженная на количество по DEFAULT. Количество товара меняет покупатель по желанию.
в новых версиях генерируемые колонки, в старых с помощью триггеров
Неактивен
Спасибо! Вот сейчас вообще всё понятно стало.
Неактивен
Страниц: 1