Basit kategoriler tablosum var. Kategori ana kategoriye (par_cat
sütun) sahip olabilir veya ana kategori ise ve aynı üst kategori ile aynı ad veya URL'ye sahip 2 veya daha fazla kategori olmamalıdır. Bu tablo içinTek sütunta benzersiz (çoklu sütunlar) ve null
Kodu:
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`);
Sorun benzersiz anahtarları olsa bile çalışmıyor olmasıdır. par_cat
null
olarak ayarlanmış ve aynı ad ve URL'ye sahip veritabanı 2 kategorisine girmeye çalışırsam, bu 2 kategori veritabanına sorun olmadan eklenebilir (ve yapmamalılar). Ancak diğer par_cat
kategorilerini seçersem (örneğin, 1 kimliğine sahip kategori varsayarak), sadece ilk kayıt eklenir (ve bu istenen davranış).
Soru - Bu dava nasıl ele alınır?
EŞSİZ indeks endeksi tüm değerler farklı olmalıdır böyle bir sınırlama oluşturur: Bunu okudum. Varolan bir satıra uyan anahtar değeriyle yeni bir satır eklemeye çalışırsanız bir hata oluşur. Bu kısıtlama, BDB depolama altyapısı dışında NULL değerlerine uygulanmaz. Diğer motorlar için, UNIQUE dizini, NULL içerebilen sütunlar için birden fazla NULL değerine izin verir. UNIQUE dizinindeki bir sütun için bir önek değeri belirtirseniz, sütun değerleri önek içinde benzersiz olmalıdır. Ben o böyle değil beklenen birden çok sütun üzerinde benzersiz var ancak eğer
(sadece par_cat
, name
boş olabilir ve url
null olamaz). par_cat
, aynı tablonun id
referansı olduğundan, ancak bazı kategoriler ana kategoriye sahip olmadığından null
değerlerine izin vermelidir.
[10-şeyler-in-mysql-bu-beklenmedik çalışma] (http://explainextended.com/2010/11/03/10-things-in-mysql-that-wont-work -as-beklenen /) –
[Bu yanıt] (http://stackoverflow.com/a/429827/3630826) sahip olduğunuz sorunu açıklayabilir. Par_cat'i null olarak değiştirmemenizi öner, root için 0 gibi bir minimun kimliği ayarla. Ve otomatik artış kategori kimliği 1. –
@JaugarChang Ama ben de par_cat' için yabancı anahtar kısıtlaması var, bu yüzden 0 –