Я пытаюсь проверить, что в таблице моей БД каждая строка связана хотя бы с одной строкой другой таблицы.
В частности, у меня есть эти 3 таблицы:
CREATE TABLE IF NOT EXISTS coltraneShop.Personage (
`Name` VARCHAR(20) NOT NULL,
CONSTRAINT PK_Personage PRIMARY KEY (`Name`)
);
CREATE TABLE IF NOT EXISTS coltraneShop.`Product_Personage` (
`Product code` BIGINT UNSIGNED NOT NULL,
`Personage's name` VARCHAR(20) NOT NULL,
CONSTRAINT PK_Product_Personage PRIMARY KEY (`Product code`, `Personage's name`)
);
ALTER TABLE coltraneShop.`Product_Personage` ADD CONSTRAINT `FK_ProductPersonage_Personage` FOREIGN KEY (`Personage's name`) REFERENCES coltraneShop.Personage(`Name`)
ON DELETE CASCADE ON UPDATE CASCADE;
CREATE TABLE IF NOT EXISTS coltraneShop.Product (
`Product code` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`Category` CHAR(9) NOT NULL,
CHECK(`Category`="DVD" OR `Category`='Album' OR `Category`='Comics' OR `Category`='Book' OR `Category`='Videogame'),
`Title` VARCHAR(50) NOT NULL,
`Quantity` INT UNSIGNED NOT NULL,
CHECK(`Quantity` BETWEEN 000 AND 999),
`Year of publication` INT UNSIGNED NOT NULL,
CHECK(`Year of publication` BETWEEN 0000 AND 9999),
`Price` DECIMAL(6,2) UNSIGNED NOT NULL,
`Shipment's name` CHAR(13) NOT NULL,
CHECK(
(SELECT count(*)
FROM coltraneShop.Product_Personage AS PP
WHERE `Category`= "Comics" AND PP.`Product code` = `Product code`) >= 1
),
CONSTRAINT PK_Product PRIMARY KEY (`Product code`)
);
ALTER TABLE coltraneShop.Product ADD CONSTRAINT `FK_Product_Shipment` FOREIGN KEY(`Shipment's name`) REFERENCES coltraneShop.Shipment(`Name`)
ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE coltraneShop.`Product_Personage` ADD CONSTRAINT `FK_ProductPersonage_Product` FOREIGN KEY (`Product code`) REFERENCES coltraneShop.Product(`Product code`)
ON DELETE CASCADE ON UPDATE CASCADE;
ОК!Таким образом, таблица «Product_Personage» выражает отношение «многие ко многим» между продуктом и персонажем.Я хочу проверить, что если строка в таблице продукта имеет атрибут «категория», установленный на «Комиксы», то этот продукт должен появиться хотя бы один раз в таблице Product_Personage.
В коде я оставил то, что мне кажется правильным в таблице продуктов.Это ПРОВЕРКА.
Я использую MySQL, и при выполнении этого кода я получаю сообщение об ошибке:
CREATE TABLE IF NOT EXISTS coltraneShop.Product ( `Product code` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`Category` CHAR(9) NOT NULL,
CHECK(`Category`="DVD" OR `Category`='Album' OR `Category`='Comics' OR `Category`='Book' OR `Category`='Videogame'), `Title` VARCHAR(50) NOT NULL,
`Quantity` INT UNSIGNED NOT NULL,
CHECK(`Quantity` BETWEEN 000 AND 999),
`Year of publication` INT UNSIGNED NOT NULL,
CHECK(`Year of publication` BETWEEN 0000 AND 9999),
`Price` DECIMAL(6,2) UNSIGNED NOT NULL,
`Shipment's name` CHAR(13) NOT NULL,
CHECK( (SELECT count(*) FROM coltraneShop.Product_Personage AS PP WHERE `Category`= "Comics" AND PP.`Product code` = `Product code`) >= 1 ),
CONSTRAINT PK_Product PRIMARY KEY (`Product code`) )
Error Code: 3815. An expression of a check constraint 'Product_chk_4' contains disallowed function.
Имеет ли смысл выполнять такую проверку, и если да, топравильно ли это написать как я?Спасибо всем!