我有简单的分类表.类别可以有父类别(par_cat
列)或空,如果它是主类别,并且具有相同的父类别,则不应该有两个或多个具有相同名称或url的类别.
此表的代码:
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(10) unsigned NOT NULL,
`par_cat` int(10) unsigned DEFAULT NULL,
`lang` varchar(2) COLLATE utf8_unicode_ci NOT NULL DEFAULT 'pl',
`name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`url` varchar(120) COLLATE utf8_unicode_ci NOT NULL,
`active` tinyint(3) unsigned NOT NULL DEFAULT '1',
`accepted` tinyint(3) unsigned NOT NULL DEFAULT '1',
`priority` int(10) unsigned NOT NULL DEFAULT '1000',
`entries` int(10) unsigned NOT NULL DEFAULT '0',
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
ALTER TABLE `categories`
ADD PRIMARY KEY (`id`),
ADD UNIQUE KEY `categories_name_par_cat_unique` (`name`,`par_cat`),
ADD UNIQUE KEY `categories_url_par_cat_unique` (`url`,`par_cat`),
ADD KEY `categories_par_cat_foreign` (`par_cat`);
ALTER TABLE `categories`
MODIFY `id` int(10) unsigned NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=3;
ALTER TABLE `categories`ADD CONSTRAINT `categories_par_cat_foreign`
FOREIGN KEY (`par_cat`) REFERENCES `categories` (`id`);
问题是,即使我有唯一的密钥,它也不起作用.如果我try 将两个par_cat
设置为null
且名称和url相同类别插入到数据库中,则这两个类别可以插入到数据库中而不会出现问题(而且它们不应该出现问题).但是,如果我为这些类别 Select 其他par_cat
(例如,假设存在id为1的类别,则为1),则只插入第一条记录(这是所需的行为).
问题-如何处理这个案件?我读到:
唯一索引创建一个约束,以便索引中的所有值 必须是不同的.如果您try 添加具有以下属性的新行,则会发生错误 与现有行匹配的键值.此限制不适用 设置为空值,但BDB存储引擎除外.对于其他引擎, 唯一索引允许对可以包含以下内容的列使用多个NULL值 空.如果为唯一索引中列指定前缀值, 列值在前缀中必须是唯一的.
但是,如果我在多个列上具有UNIQUE,则情况并非如此(只有par_cat
个可以为NULL,name
和url
不能为NULL).因为par_cat
个对同一表的id
个引用,但是有些类别没有父类别,所以应该允许null
个值.